Initial commit
This commit is contained in:
@@ -0,0 +1,113 @@
|
||||
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
/**
|
||||
* CodeIgniter
|
||||
*
|
||||
* An open source application development framework for PHP 4.3.2 or newer
|
||||
*
|
||||
* @package CodeIgniter
|
||||
* @author ExpressionEngine Dev Team
|
||||
* @copyright Copyright (c) 2008 - 2010, EllisLab, Inc.
|
||||
* @license http://codeigniter.com/user_guide/license.html
|
||||
* @link http://codeigniter.com
|
||||
* @since Version 1.0
|
||||
* @filesource
|
||||
*/
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* CodeIgniter Benchmark Class
|
||||
*
|
||||
* This class enables you to mark points and calculate the time difference
|
||||
* between them. Memory consumption can also be displayed.
|
||||
*
|
||||
* @package CodeIgniter
|
||||
* @subpackage Libraries
|
||||
* @category Libraries
|
||||
* @author ExpressionEngine Dev Team
|
||||
* @link http://codeigniter.com/user_guide/libraries/benchmark.html
|
||||
*/
|
||||
class CI_Benchmark {
|
||||
|
||||
var $marker = array();
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Set a benchmark marker
|
||||
*
|
||||
* Multiple calls to this function can be made so that several
|
||||
* execution points can be timed
|
||||
*
|
||||
* @access public
|
||||
* @param string $name name of the marker
|
||||
* @return void
|
||||
*/
|
||||
function mark($name)
|
||||
{
|
||||
$this->marker[$name] = microtime();
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Calculates the time difference between two marked points.
|
||||
*
|
||||
* If the first parameter is empty this function instead returns the
|
||||
* {elapsed_time} pseudo-variable. This permits the full system
|
||||
* execution time to be shown in a template. The output class will
|
||||
* swap the real value for this variable.
|
||||
*
|
||||
* @access public
|
||||
* @param string a particular marked point
|
||||
* @param string a particular marked point
|
||||
* @param integer the number of decimal places
|
||||
* @return mixed
|
||||
*/
|
||||
function elapsed_time($point1 = '', $point2 = '', $decimals = 4)
|
||||
{
|
||||
if ($point1 == '')
|
||||
{
|
||||
return '{elapsed_time}';
|
||||
}
|
||||
|
||||
if ( ! isset($this->marker[$point1]))
|
||||
{
|
||||
return '';
|
||||
}
|
||||
|
||||
if ( ! isset($this->marker[$point2]))
|
||||
{
|
||||
$this->marker[$point2] = microtime();
|
||||
}
|
||||
|
||||
list($sm, $ss) = explode(' ', $this->marker[$point1]);
|
||||
list($em, $es) = explode(' ', $this->marker[$point2]);
|
||||
|
||||
return number_format(($em + $es) - ($sm + $ss), $decimals);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Memory Usage
|
||||
*
|
||||
* This function returns the {memory_usage} pseudo-variable.
|
||||
* This permits it to be put it anywhere in a template
|
||||
* without the memory being calculated until the end.
|
||||
* The output class will swap the real value for this variable.
|
||||
*
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
function memory_usage()
|
||||
{
|
||||
return '{memory_usage}';
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// END CI_Benchmark class
|
||||
|
||||
/* End of file Benchmark.php */
|
||||
/* Location: ./system/libraries/Benchmark.php */
|
||||
@@ -0,0 +1,477 @@
|
||||
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
/**
|
||||
* CodeIgniter
|
||||
*
|
||||
* An open source application development framework for PHP 4.3.2 or newer
|
||||
*
|
||||
* @package CodeIgniter
|
||||
* @author ExpressionEngine Dev Team
|
||||
* @copyright Copyright (c) 2008 - 2010, EllisLab, Inc.
|
||||
* @license http://codeigniter.com/user_guide/license.html
|
||||
* @link http://codeigniter.com
|
||||
* @since Version 1.0
|
||||
* @filesource
|
||||
*/
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* CodeIgniter Calendar Class
|
||||
*
|
||||
* This class enables the creation of calendars
|
||||
*
|
||||
* @package CodeIgniter
|
||||
* @subpackage Libraries
|
||||
* @category Libraries
|
||||
* @author ExpressionEngine Dev Team
|
||||
* @link http://codeigniter.com/user_guide/libraries/calendar.html
|
||||
*/
|
||||
class CI_Calendar {
|
||||
|
||||
var $CI;
|
||||
var $lang;
|
||||
var $local_time;
|
||||
var $template = '';
|
||||
var $start_day = 'sunday';
|
||||
var $month_type = 'long';
|
||||
var $day_type = 'abr';
|
||||
var $show_next_prev = FALSE;
|
||||
var $next_prev_url = '';
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* Loads the calendar language file and sets the default time reference
|
||||
*
|
||||
* @access public
|
||||
*/
|
||||
function CI_Calendar($config = array())
|
||||
{
|
||||
$this->CI =& get_instance();
|
||||
|
||||
if ( ! in_array('calendar_lang'.EXT, $this->CI->lang->is_loaded, TRUE))
|
||||
{
|
||||
$this->CI->lang->load('calendar');
|
||||
}
|
||||
|
||||
$this->local_time = time();
|
||||
|
||||
if (count($config) > 0)
|
||||
{
|
||||
$this->initialize($config);
|
||||
}
|
||||
|
||||
log_message('debug', "Calendar Class Initialized");
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Initialize the user preferences
|
||||
*
|
||||
* Accepts an associative array as input, containing display preferences
|
||||
*
|
||||
* @access public
|
||||
* @param array config preferences
|
||||
* @return void
|
||||
*/
|
||||
function initialize($config = array())
|
||||
{
|
||||
foreach ($config as $key => $val)
|
||||
{
|
||||
if (isset($this->$key))
|
||||
{
|
||||
$this->$key = $val;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Generate the calendar
|
||||
*
|
||||
* @access public
|
||||
* @param integer the year
|
||||
* @param integer the month
|
||||
* @param array the data to be shown in the calendar cells
|
||||
* @return string
|
||||
*/
|
||||
function generate($year = '', $month = '', $data = array())
|
||||
{
|
||||
// Set and validate the supplied month/year
|
||||
if ($year == '')
|
||||
$year = date("Y", $this->local_time);
|
||||
|
||||
if ($month == '')
|
||||
$month = date("m", $this->local_time);
|
||||
|
||||
if (strlen($year) == 1)
|
||||
$year = '200'.$year;
|
||||
|
||||
if (strlen($year) == 2)
|
||||
$year = '20'.$year;
|
||||
|
||||
if (strlen($month) == 1)
|
||||
$month = '0'.$month;
|
||||
|
||||
$adjusted_date = $this->adjust_date($month, $year);
|
||||
|
||||
$month = $adjusted_date['month'];
|
||||
$year = $adjusted_date['year'];
|
||||
|
||||
// Determine the total days in the month
|
||||
$total_days = $this->get_total_days($month, $year);
|
||||
|
||||
// Set the starting day of the week
|
||||
$start_days = array('sunday' => 0, 'monday' => 1, 'tuesday' => 2, 'wednesday' => 3, 'thursday' => 4, 'friday' => 5, 'saturday' => 6);
|
||||
$start_day = ( ! isset($start_days[$this->start_day])) ? 0 : $start_days[$this->start_day];
|
||||
|
||||
// Set the starting day number
|
||||
$local_date = mktime(12, 0, 0, $month, 1, $year);
|
||||
$date = getdate($local_date);
|
||||
$day = $start_day + 1 - $date["wday"];
|
||||
|
||||
while ($day > 1)
|
||||
{
|
||||
$day -= 7;
|
||||
}
|
||||
|
||||
// Set the current month/year/day
|
||||
// We use this to determine the "today" date
|
||||
$cur_year = date("Y", $this->local_time);
|
||||
$cur_month = date("m", $this->local_time);
|
||||
$cur_day = date("j", $this->local_time);
|
||||
|
||||
$is_current_month = ($cur_year == $year AND $cur_month == $month) ? TRUE : FALSE;
|
||||
|
||||
// Generate the template data array
|
||||
$this->parse_template();
|
||||
|
||||
// Begin building the calendar output
|
||||
$out = $this->temp['table_open'];
|
||||
$out .= "\n";
|
||||
|
||||
$out .= "\n";
|
||||
$out .= $this->temp['heading_row_start'];
|
||||
$out .= "\n";
|
||||
|
||||
// "previous" month link
|
||||
if ($this->show_next_prev == TRUE)
|
||||
{
|
||||
// Add a trailing slash to the URL if needed
|
||||
$this->next_prev_url = preg_replace("/(.+?)\/*$/", "\\1/", $this->next_prev_url);
|
||||
|
||||
$adjusted_date = $this->adjust_date($month - 1, $year);
|
||||
$out .= str_replace('{previous_url}', $this->next_prev_url.$adjusted_date['year'].'/'.$adjusted_date['month'], $this->temp['heading_previous_cell']);
|
||||
$out .= "\n";
|
||||
}
|
||||
|
||||
// Heading containing the month/year
|
||||
$colspan = ($this->show_next_prev == TRUE) ? 5 : 7;
|
||||
|
||||
$this->temp['heading_title_cell'] = str_replace('{colspan}', $colspan, $this->temp['heading_title_cell']);
|
||||
$this->temp['heading_title_cell'] = str_replace('{heading}', $this->get_month_name($month)." ".$year, $this->temp['heading_title_cell']);
|
||||
|
||||
$out .= $this->temp['heading_title_cell'];
|
||||
$out .= "\n";
|
||||
|
||||
// "next" month link
|
||||
if ($this->show_next_prev == TRUE)
|
||||
{
|
||||
$adjusted_date = $this->adjust_date($month + 1, $year);
|
||||
$out .= str_replace('{next_url}', $this->next_prev_url.$adjusted_date['year'].'/'.$adjusted_date['month'], $this->temp['heading_next_cell']);
|
||||
}
|
||||
|
||||
$out .= "\n";
|
||||
$out .= $this->temp['heading_row_end'];
|
||||
$out .= "\n";
|
||||
|
||||
// Write the cells containing the days of the week
|
||||
$out .= "\n";
|
||||
$out .= $this->temp['week_row_start'];
|
||||
$out .= "\n";
|
||||
|
||||
$day_names = $this->get_day_names();
|
||||
|
||||
for ($i = 0; $i < 7; $i ++)
|
||||
{
|
||||
$out .= str_replace('{week_day}', $day_names[($start_day + $i) %7], $this->temp['week_day_cell']);
|
||||
}
|
||||
|
||||
$out .= "\n";
|
||||
$out .= $this->temp['week_row_end'];
|
||||
$out .= "\n";
|
||||
|
||||
// Build the main body of the calendar
|
||||
while ($day <= $total_days)
|
||||
{
|
||||
$out .= "\n";
|
||||
$out .= $this->temp['cal_row_start'];
|
||||
$out .= "\n";
|
||||
|
||||
for ($i = 0; $i < 7; $i++)
|
||||
{
|
||||
$out .= ($is_current_month == TRUE AND $day == $cur_day) ? $this->temp['cal_cell_start_today'] : $this->temp['cal_cell_start'];
|
||||
|
||||
if ($day > 0 AND $day <= $total_days)
|
||||
{
|
||||
if (isset($data[$day]))
|
||||
{
|
||||
// Cells with content
|
||||
$temp = ($is_current_month == TRUE AND $day == $cur_day) ? $this->temp['cal_cell_content_today'] : $this->temp['cal_cell_content'];
|
||||
$out .= str_replace('{day}', $day, str_replace('{content}', $data[$day], $temp));
|
||||
}
|
||||
else
|
||||
{
|
||||
// Cells with no content
|
||||
$temp = ($is_current_month == TRUE AND $day == $cur_day) ? $this->temp['cal_cell_no_content_today'] : $this->temp['cal_cell_no_content'];
|
||||
$out .= str_replace('{day}', $day, $temp);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Blank cells
|
||||
$out .= $this->temp['cal_cell_blank'];
|
||||
}
|
||||
|
||||
$out .= ($is_current_month == TRUE AND $day == $cur_day) ? $this->temp['cal_cell_end_today'] : $this->temp['cal_cell_end'];
|
||||
$day++;
|
||||
}
|
||||
|
||||
$out .= "\n";
|
||||
$out .= $this->temp['cal_row_end'];
|
||||
$out .= "\n";
|
||||
}
|
||||
|
||||
$out .= "\n";
|
||||
$out .= $this->temp['table_close'];
|
||||
|
||||
return $out;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Get Month Name
|
||||
*
|
||||
* Generates a textual month name based on the numeric
|
||||
* month provided.
|
||||
*
|
||||
* @access public
|
||||
* @param integer the month
|
||||
* @return string
|
||||
*/
|
||||
function get_month_name($month)
|
||||
{
|
||||
if ($this->month_type == 'short')
|
||||
{
|
||||
$month_names = array('01' => 'cal_jan', '02' => 'cal_feb', '03' => 'cal_mar', '04' => 'cal_apr', '05' => 'cal_may', '06' => 'cal_jun', '07' => 'cal_jul', '08' => 'cal_aug', '09' => 'cal_sep', '10' => 'cal_oct', '11' => 'cal_nov', '12' => 'cal_dec');
|
||||
}
|
||||
else
|
||||
{
|
||||
$month_names = array('01' => 'cal_january', '02' => 'cal_february', '03' => 'cal_march', '04' => 'cal_april', '05' => 'cal_mayl', '06' => 'cal_june', '07' => 'cal_july', '08' => 'cal_august', '09' => 'cal_september', '10' => 'cal_october', '11' => 'cal_november', '12' => 'cal_december');
|
||||
}
|
||||
|
||||
$month = $month_names[$month];
|
||||
|
||||
if ($this->CI->lang->line($month) === FALSE)
|
||||
{
|
||||
return ucfirst(str_replace('cal_', '', $month));
|
||||
}
|
||||
|
||||
return $this->CI->lang->line($month);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Get Day Names
|
||||
*
|
||||
* Returns an array of day names (Sunday, Monday, etc.) based
|
||||
* on the type. Options: long, short, abrev
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @return array
|
||||
*/
|
||||
function get_day_names($day_type = '')
|
||||
{
|
||||
if ($day_type != '')
|
||||
$this->day_type = $day_type;
|
||||
|
||||
if ($this->day_type == 'long')
|
||||
{
|
||||
$day_names = array('sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday');
|
||||
}
|
||||
elseif ($this->day_type == 'short')
|
||||
{
|
||||
$day_names = array('sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat');
|
||||
}
|
||||
else
|
||||
{
|
||||
$day_names = array('su', 'mo', 'tu', 'we', 'th', 'fr', 'sa');
|
||||
}
|
||||
|
||||
$days = array();
|
||||
foreach ($day_names as $val)
|
||||
{
|
||||
$days[] = ($this->CI->lang->line('cal_'.$val) === FALSE) ? ucfirst($val) : $this->CI->lang->line('cal_'.$val);
|
||||
}
|
||||
|
||||
return $days;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Adjust Date
|
||||
*
|
||||
* This function makes sure that we have a valid month/year.
|
||||
* For example, if you submit 13 as the month, the year will
|
||||
* increment and the month will become January.
|
||||
*
|
||||
* @access public
|
||||
* @param integer the month
|
||||
* @param integer the year
|
||||
* @return array
|
||||
*/
|
||||
function adjust_date($month, $year)
|
||||
{
|
||||
$date = array();
|
||||
|
||||
$date['month'] = $month;
|
||||
$date['year'] = $year;
|
||||
|
||||
while ($date['month'] > 12)
|
||||
{
|
||||
$date['month'] -= 12;
|
||||
$date['year']++;
|
||||
}
|
||||
|
||||
while ($date['month'] <= 0)
|
||||
{
|
||||
$date['month'] += 12;
|
||||
$date['year']--;
|
||||
}
|
||||
|
||||
if (strlen($date['month']) == 1)
|
||||
{
|
||||
$date['month'] = '0'.$date['month'];
|
||||
}
|
||||
|
||||
return $date;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Total days in a given month
|
||||
*
|
||||
* @access public
|
||||
* @param integer the month
|
||||
* @param integer the year
|
||||
* @return integer
|
||||
*/
|
||||
function get_total_days($month, $year)
|
||||
{
|
||||
$days_in_month = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
|
||||
|
||||
if ($month < 1 OR $month > 12)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Is the year a leap year?
|
||||
if ($month == 2)
|
||||
{
|
||||
if ($year % 400 == 0 OR ($year % 4 == 0 AND $year % 100 != 0))
|
||||
{
|
||||
return 29;
|
||||
}
|
||||
}
|
||||
|
||||
return $days_in_month[$month - 1];
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Set Default Template Data
|
||||
*
|
||||
* This is used in the event that the user has not created their own template
|
||||
*
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
function default_template()
|
||||
{
|
||||
return array (
|
||||
'table_open' => '<table border="0" cellpadding="4" cellspacing="0">',
|
||||
'heading_row_start' => '<tr>',
|
||||
'heading_previous_cell' => '<th><a href="{previous_url}"><<</a></th>',
|
||||
'heading_title_cell' => '<th colspan="{colspan}">{heading}</th>',
|
||||
'heading_next_cell' => '<th><a href="{next_url}">>></a></th>',
|
||||
'heading_row_end' => '</tr>',
|
||||
'week_row_start' => '<tr>',
|
||||
'week_day_cell' => '<td>{week_day}</td>',
|
||||
'week_row_end' => '</tr>',
|
||||
'cal_row_start' => '<tr>',
|
||||
'cal_cell_start' => '<td>',
|
||||
'cal_cell_start_today' => '<td>',
|
||||
'cal_cell_content' => '<a href="{content}">{day}</a>',
|
||||
'cal_cell_content_today' => '<a href="{content}"><strong>{day}</strong></a>',
|
||||
'cal_cell_no_content' => '{day}',
|
||||
'cal_cell_no_content_today' => '<strong>{day}</strong>',
|
||||
'cal_cell_blank' => ' ',
|
||||
'cal_cell_end' => '</td>',
|
||||
'cal_cell_end_today' => '</td>',
|
||||
'cal_row_end' => '</tr>',
|
||||
'table_close' => '</table>'
|
||||
);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Parse Template
|
||||
*
|
||||
* Harvests the data within the template {pseudo-variables}
|
||||
* used to display the calendar
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
function parse_template()
|
||||
{
|
||||
$this->temp = $this->default_template();
|
||||
|
||||
if ($this->template == '')
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
$today = array('cal_cell_start_today', 'cal_cell_content_today', 'cal_cell_no_content_today', 'cal_cell_end_today');
|
||||
|
||||
foreach (array('table_open', 'table_close', 'heading_row_start', 'heading_previous_cell', 'heading_title_cell', 'heading_next_cell', 'heading_row_end', 'week_row_start', 'week_day_cell', 'week_row_end', 'cal_row_start', 'cal_cell_start', 'cal_cell_content', 'cal_cell_no_content', 'cal_cell_blank', 'cal_cell_end', 'cal_row_end', 'cal_cell_start_today', 'cal_cell_content_today', 'cal_cell_no_content_today', 'cal_cell_end_today') as $val)
|
||||
{
|
||||
if (preg_match("/\{".$val."\}(.*?)\{\/".$val."\}/si", $this->template, $match))
|
||||
{
|
||||
$this->temp[$val] = $match['1'];
|
||||
}
|
||||
else
|
||||
{
|
||||
if (in_array($val, $today, TRUE))
|
||||
{
|
||||
$this->temp[$val] = $this->temp[str_replace('_today', '', $val)];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// END CI_Calendar class
|
||||
|
||||
/* End of file Calendar.php */
|
||||
/* Location: ./system/libraries/Calendar.php */
|
||||
@@ -0,0 +1,550 @@
|
||||
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
/**
|
||||
* CodeIgniter
|
||||
*
|
||||
* An open source application development framework for PHP 4.3.2 or newer
|
||||
*
|
||||
* @package CodeIgniter
|
||||
* @author ExpressionEngine Dev Team
|
||||
* @copyright Copyright (c) 2006 - 2010, EllisLab, Inc.
|
||||
* @license http://codeigniter.com/user_guide/license.html
|
||||
* @link http://codeigniter.com
|
||||
* @since Version 1.0
|
||||
* @filesource
|
||||
*/
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Shopping Cart Class
|
||||
*
|
||||
* @package CodeIgniter
|
||||
* @subpackage Libraries
|
||||
* @category Shopping Cart
|
||||
* @author ExpressionEngine Dev Team
|
||||
* @link http://codeigniter.com/user_guide/libraries/cart.html
|
||||
*/
|
||||
class CI_Cart {
|
||||
|
||||
// These are the regular expression rules that we use to validate the product ID and product name
|
||||
var $product_id_rules = '\.a-z0-9_-'; // alpha-numeric, dashes, underscores, or periods
|
||||
var $product_name_rules = '\.\:\-_ a-z0-9'; // alpha-numeric, dashes, underscores, colons or periods
|
||||
|
||||
// Private variables. Do not change!
|
||||
var $CI;
|
||||
var $_cart_contents = array();
|
||||
|
||||
|
||||
/**
|
||||
* Shopping Class Constructor
|
||||
*
|
||||
* The constructor loads the Session class, used to store the shopping cart contents.
|
||||
*/
|
||||
function CI_Cart($params = array())
|
||||
{
|
||||
// Set the super object to a local variable for use later
|
||||
$this->CI =& get_instance();
|
||||
|
||||
// Are any config settings being passed manually? If so, set them
|
||||
$config = array();
|
||||
if (count($params) > 0)
|
||||
{
|
||||
foreach ($params as $key => $val)
|
||||
{
|
||||
$config[$key] = $val;
|
||||
}
|
||||
}
|
||||
|
||||
// Load the Sessions class
|
||||
$this->CI->load->library('session', $config);
|
||||
|
||||
// Grab the shopping cart array from the session table, if it exists
|
||||
if ($this->CI->session->userdata('cart_contents') !== FALSE)
|
||||
{
|
||||
$this->_cart_contents = $this->CI->session->userdata('cart_contents');
|
||||
}
|
||||
else
|
||||
{
|
||||
// No cart exists so we'll set some base values
|
||||
$this->_cart_contents['cart_total'] = 0;
|
||||
$this->_cart_contents['total_items'] = 0;
|
||||
}
|
||||
|
||||
log_message('debug', "Cart Class Initialized");
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Insert items into the cart and save it to the session table
|
||||
*
|
||||
* @access public
|
||||
* @param array
|
||||
* @return bool
|
||||
*/
|
||||
function insert($items = array())
|
||||
{
|
||||
// Was any cart data passed? No? Bah...
|
||||
if ( ! is_array($items) OR count($items) == 0)
|
||||
{
|
||||
log_message('error', 'The insert method must be passed an array containing data.');
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// You can either insert a single product using a one-dimensional array,
|
||||
// or multiple products using a multi-dimensional one. The way we
|
||||
// determine the array type is by looking for a required array key named "id"
|
||||
// at the top level. If it's not found, we will assume it's a multi-dimensional array.
|
||||
|
||||
$save_cart = FALSE;
|
||||
if (isset($items['id']))
|
||||
{
|
||||
if ($this->_insert($items) == TRUE)
|
||||
{
|
||||
$save_cart = TRUE;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach ($items as $val)
|
||||
{
|
||||
if (is_array($val) AND isset($val['id']))
|
||||
{
|
||||
if ($this->_insert($val) == TRUE)
|
||||
{
|
||||
$save_cart = TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Save the cart data if the insert was successful
|
||||
if ($save_cart == TRUE)
|
||||
{
|
||||
$this->_save_cart();
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Insert
|
||||
*
|
||||
* @access private
|
||||
* @param array
|
||||
* @return bool
|
||||
*/
|
||||
function _insert($items = array())
|
||||
{
|
||||
// Was any cart data passed? No? Bah...
|
||||
if ( ! is_array($items) OR count($items) == 0)
|
||||
{
|
||||
log_message('error', 'The insert method must be passed an array containing data.');
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
// Does the $items array contain an id, quantity, price, and name? These are required
|
||||
if ( ! isset($items['id']) OR ! isset($items['qty']) OR ! isset($items['price']) OR ! isset($items['name']))
|
||||
{
|
||||
log_message('error', 'The cart array must contain a product ID, quantity, price, and name.');
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
// Prep the quantity. It can only be a number. Duh...
|
||||
$items['qty'] = trim(preg_replace('/([^0-9])/i', '', $items['qty']));
|
||||
// Trim any leading zeros
|
||||
$items['qty'] = trim(preg_replace('/(^[0]+)/i', '', $items['qty']));
|
||||
|
||||
// If the quantity is zero or blank there's nothing for us to do
|
||||
if ( ! is_numeric($items['qty']) OR $items['qty'] == 0)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
// Validate the product ID. It can only be alpha-numeric, dashes, underscores or periods
|
||||
// Not totally sure we should impose this rule, but it seems prudent to standardize IDs.
|
||||
// Note: These can be user-specified by setting the $this->product_id_rules variable.
|
||||
if ( ! preg_match("/^[".$this->product_id_rules."]+$/i", $items['id']))
|
||||
{
|
||||
log_message('error', 'Invalid product ID. The product ID can only contain alpha-numeric characters, dashes, and underscores');
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
// Validate the product name. It can only be alpha-numeric, dashes, underscores, colons or periods.
|
||||
// Note: These can be user-specified by setting the $this->product_name_rules variable.
|
||||
if ( ! preg_match("/^[".$this->product_name_rules."]+$/i", $items['name']))
|
||||
{
|
||||
log_message('error', 'An invalid name was submitted as the product name: '.$items['name'].' The name can only contain alpha-numeric characters, dashes, underscores, colons, and spaces');
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
// Prep the price. Remove anything that isn't a number or decimal point.
|
||||
$items['price'] = trim(preg_replace('/([^0-9\.])/i', '', $items['price']));
|
||||
// Trim any leading zeros
|
||||
$items['price'] = trim(preg_replace('/(^[0]+)/i', '', $items['price']));
|
||||
|
||||
// Is the price a valid number?
|
||||
if ( ! is_numeric($items['price']))
|
||||
{
|
||||
log_message('error', 'An invalid price was submitted for product ID: '.$items['id']);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
// We now need to create a unique identifier for the item being inserted into the cart.
|
||||
// Every time something is added to the cart it is stored in the master cart array.
|
||||
// Each row in the cart array, however, must have a unique index that identifies not only
|
||||
// a particular product, but makes it possible to store identical products with different options.
|
||||
// For example, what if someone buys two identical t-shirts (same product ID), but in
|
||||
// different sizes? The product ID (and other attributes, like the name) will be identical for
|
||||
// both sizes because it's the same shirt. The only difference will be the size.
|
||||
// Internally, we need to treat identical submissions, but with different options, as a unique product.
|
||||
// Our solution is to convert the options array to a string and MD5 it along with the product ID.
|
||||
// This becomes the unique "row ID"
|
||||
if (isset($items['options']) AND count($items['options']) > 0)
|
||||
{
|
||||
$rowid = md5($items['id'].implode('', $items['options']));
|
||||
}
|
||||
else
|
||||
{
|
||||
// No options were submitted so we simply MD5 the product ID.
|
||||
// Technically, we don't need to MD5 the ID in this case, but it makes
|
||||
// sense to standardize the format of array indexes for both conditions
|
||||
$rowid = md5($items['id']);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
// Now that we have our unique "row ID", we'll add our cart items to the master array
|
||||
|
||||
// let's unset this first, just to make sure our index contains only the data from this submission
|
||||
unset($this->_cart_contents[$rowid]);
|
||||
|
||||
// Create a new index with our new row ID
|
||||
$this->_cart_contents[$rowid]['rowid'] = $rowid;
|
||||
|
||||
// And add the new items to the cart array
|
||||
foreach ($items as $key => $val)
|
||||
{
|
||||
$this->_cart_contents[$rowid][$key] = $val;
|
||||
}
|
||||
|
||||
// Woot!
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Update the cart
|
||||
*
|
||||
* This function permits the quantity of a given item to be changed.
|
||||
* Typically it is called from the "view cart" page if a user makes
|
||||
* changes to the quantity before checkout. That array must contain the
|
||||
* product ID and quantity for each item.
|
||||
*
|
||||
* @access public
|
||||
* @param array
|
||||
* @param string
|
||||
* @return bool
|
||||
*/
|
||||
function update($items = array())
|
||||
{
|
||||
// Was any cart data passed?
|
||||
if ( ! is_array($items) OR count($items) == 0)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// You can either update a single product using a one-dimensional array,
|
||||
// or multiple products using a multi-dimensional one. The way we
|
||||
// determine the array type is by looking for a required array key named "id".
|
||||
// If it's not found we assume it's a multi-dimensional array
|
||||
$save_cart = FALSE;
|
||||
if (isset($items['rowid']) AND isset($items['qty']))
|
||||
{
|
||||
if ($this->_update($items) == TRUE)
|
||||
{
|
||||
$save_cart = TRUE;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach ($items as $val)
|
||||
{
|
||||
if (is_array($val) AND isset($val['rowid']) AND isset($val['qty']))
|
||||
{
|
||||
if ($this->_update($val) == TRUE)
|
||||
{
|
||||
$save_cart = TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Save the cart data if the insert was successful
|
||||
if ($save_cart == TRUE)
|
||||
{
|
||||
$this->_save_cart();
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Update the cart
|
||||
*
|
||||
* This function permits the quantity of a given item to be changed.
|
||||
* Typically it is called from the "view cart" page if a user makes
|
||||
* changes to the quantity before checkout. That array must contain the
|
||||
* product ID and quantity for each item.
|
||||
*
|
||||
* @access private
|
||||
* @param array
|
||||
* @return bool
|
||||
*/
|
||||
function _update($items = array())
|
||||
{
|
||||
// Without these array indexes there is nothing we can do
|
||||
if ( ! isset($items['qty']) OR ! isset($items['rowid']) OR ! isset($this->_cart_contents[$items['rowid']]))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// Prep the quantity
|
||||
$items['qty'] = preg_replace('/([^0-9])/i', '', $items['qty']);
|
||||
|
||||
// Is the quantity a number?
|
||||
if ( ! is_numeric($items['qty']))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// Is the new quantity different than what is already saved in the cart?
|
||||
// If it's the same there's nothing to do
|
||||
if ($this->_cart_contents[$items['rowid']]['qty'] == $items['qty'])
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// Is the quantity zero? If so we will remove the item from the cart.
|
||||
// If the quantity is greater than zero we are updating
|
||||
if ($items['qty'] == 0)
|
||||
{
|
||||
unset($this->_cart_contents[$items['rowid']]);
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->_cart_contents[$items['rowid']]['qty'] = $items['qty'];
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Save the cart array to the session DB
|
||||
*
|
||||
* @access private
|
||||
* @return bool
|
||||
*/
|
||||
function _save_cart()
|
||||
{
|
||||
// Unset these so our total can be calculated correctly below
|
||||
unset($this->_cart_contents['total_items']);
|
||||
unset($this->_cart_contents['cart_total']);
|
||||
|
||||
// Lets add up the individual prices and set the cart sub-total
|
||||
$total = 0;
|
||||
foreach ($this->_cart_contents as $key => $val)
|
||||
{
|
||||
// We make sure the array contains the proper indexes
|
||||
if ( ! is_array($val) OR ! isset($val['price']) OR ! isset($val['qty']))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
$total += ($val['price'] * $val['qty']);
|
||||
|
||||
// Set the subtotal
|
||||
$this->_cart_contents[$key]['subtotal'] = ($this->_cart_contents[$key]['price'] * $this->_cart_contents[$key]['qty']);
|
||||
}
|
||||
|
||||
// Set the cart total and total items.
|
||||
$this->_cart_contents['total_items'] = count($this->_cart_contents);
|
||||
$this->_cart_contents['cart_total'] = $total;
|
||||
|
||||
// Is our cart empty? If so we delete it from the session
|
||||
if (count($this->_cart_contents) <= 2)
|
||||
{
|
||||
$this->CI->session->unset_userdata('cart_contents');
|
||||
|
||||
// Nothing more to do... coffee time!
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// If we made it this far it means that our cart has data.
|
||||
// Let's pass it to the Session class so it can be stored
|
||||
$this->CI->session->set_userdata(array('cart_contents' => $this->_cart_contents));
|
||||
|
||||
// Woot!
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Cart Total
|
||||
*
|
||||
* @access public
|
||||
* @return integer
|
||||
*/
|
||||
function total()
|
||||
{
|
||||
return $this->_cart_contents['cart_total'];
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Total Items
|
||||
*
|
||||
* Returns the total item count
|
||||
*
|
||||
* @access public
|
||||
* @return integer
|
||||
*/
|
||||
function total_items()
|
||||
{
|
||||
return $this->_cart_contents['total_items'];
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Cart Contents
|
||||
*
|
||||
* Returns the entire cart array
|
||||
*
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
function contents()
|
||||
{
|
||||
$cart = $this->_cart_contents;
|
||||
|
||||
// Remove these so they don't create a problem when showing the cart table
|
||||
unset($cart['total_items']);
|
||||
unset($cart['cart_total']);
|
||||
|
||||
return $cart;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Has options
|
||||
*
|
||||
* Returns TRUE if the rowid passed to this function correlates to an item
|
||||
* that has options associated with it.
|
||||
*
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
function has_options($rowid = '')
|
||||
{
|
||||
if ( ! isset($this->_cart_contents[$rowid]['options']) OR count($this->_cart_contents[$rowid]['options']) === 0)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Product options
|
||||
*
|
||||
* Returns the an array of options, for a particular product row ID
|
||||
*
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
function product_options($rowid = '')
|
||||
{
|
||||
if ( ! isset($this->_cart_contents[$rowid]['options']))
|
||||
{
|
||||
return array();
|
||||
}
|
||||
|
||||
return $this->_cart_contents[$rowid]['options'];
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Format Number
|
||||
*
|
||||
* Returns the supplied number with commas and a decimal point.
|
||||
*
|
||||
* @access public
|
||||
* @return integer
|
||||
*/
|
||||
function format_number($n = '')
|
||||
{
|
||||
if ($n == '')
|
||||
{
|
||||
return '';
|
||||
}
|
||||
|
||||
// Remove anything that isn't a number or decimal point.
|
||||
$n = trim(preg_replace('/([^0-9\.])/i', '', $n));
|
||||
|
||||
return number_format($n, 2, '.', ',');
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Destroy the cart
|
||||
*
|
||||
* Empties the cart and kills the session
|
||||
*
|
||||
* @access public
|
||||
* @return null
|
||||
*/
|
||||
function destroy()
|
||||
{
|
||||
unset($this->_cart_contents);
|
||||
|
||||
$this->_cart_contents['cart_total'] = 0;
|
||||
$this->_cart_contents['total_items'] = 0;
|
||||
|
||||
$this->CI->session->unset_userdata('cart_contents');
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
// END Cart Class
|
||||
|
||||
/* End of file Cart.php */
|
||||
/* Location: ./system/libraries/Cart.php */
|
||||
@@ -0,0 +1,244 @@
|
||||
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
/**
|
||||
* CodeIgniter
|
||||
*
|
||||
* An open source application development framework for PHP 4.3.2 or newer
|
||||
*
|
||||
* @package CodeIgniter
|
||||
* @author ExpressionEngine Dev Team
|
||||
* @copyright Copyright (c) 2008 - 2010, EllisLab, Inc.
|
||||
* @license http://codeigniter.com/user_guide/license.html
|
||||
* @link http://codeigniter.com
|
||||
* @since Version 1.0
|
||||
* @filesource
|
||||
*/
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* CodeIgniter Config Class
|
||||
*
|
||||
* This class contains functions that enable config files to be managed
|
||||
*
|
||||
* @package CodeIgniter
|
||||
* @subpackage Libraries
|
||||
* @category Libraries
|
||||
* @author ExpressionEngine Dev Team
|
||||
* @link http://codeigniter.com/user_guide/libraries/config.html
|
||||
*/
|
||||
class CI_Config {
|
||||
|
||||
var $config = array();
|
||||
var $is_loaded = array();
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* Sets the $config data from the primary config.php file as a class variable
|
||||
*
|
||||
* @access public
|
||||
* @param string the config file name
|
||||
* @param boolean if configuration values should be loaded into their own section
|
||||
* @param boolean true if errors should just return false, false if an error message should be displayed
|
||||
* @return boolean if the file was successfully loaded or not
|
||||
*/
|
||||
function CI_Config()
|
||||
{
|
||||
$this->config =& get_config();
|
||||
log_message('debug', "Config Class Initialized");
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Load Config File
|
||||
*
|
||||
* @access public
|
||||
* @param string the config file name
|
||||
* @return boolean if the file was loaded correctly
|
||||
*/
|
||||
function load($file = '', $use_sections = FALSE, $fail_gracefully = FALSE)
|
||||
{
|
||||
$file = ($file == '') ? 'config' : str_replace(EXT, '', $file);
|
||||
|
||||
if (in_array($file, $this->is_loaded, TRUE))
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
if ( ! file_exists(APPPATH.'config/'.$file.EXT))
|
||||
{
|
||||
if ($fail_gracefully === TRUE)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
show_error('The configuration file '.$file.EXT.' does not exist.');
|
||||
}
|
||||
|
||||
include(APPPATH.'config/'.$file.EXT);
|
||||
|
||||
if ( ! isset($config) OR ! is_array($config))
|
||||
{
|
||||
if ($fail_gracefully === TRUE)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
show_error('Your '.$file.EXT.' file does not appear to contain a valid configuration array.');
|
||||
}
|
||||
|
||||
if ($use_sections === TRUE)
|
||||
{
|
||||
if (isset($this->config[$file]))
|
||||
{
|
||||
$this->config[$file] = array_merge($this->config[$file], $config);
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->config[$file] = $config;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->config = array_merge($this->config, $config);
|
||||
}
|
||||
|
||||
$this->is_loaded[] = $file;
|
||||
unset($config);
|
||||
|
||||
log_message('debug', 'Config file loaded: config/'.$file.EXT);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Fetch a config file item
|
||||
*
|
||||
*
|
||||
* @access public
|
||||
* @param string the config item name
|
||||
* @param string the index name
|
||||
* @param bool
|
||||
* @return string
|
||||
*/
|
||||
function item($item, $index = '')
|
||||
{
|
||||
if ($index == '')
|
||||
{
|
||||
if ( ! isset($this->config[$item]))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
$pref = $this->config[$item];
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( ! isset($this->config[$index]))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if ( ! isset($this->config[$index][$item]))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
$pref = $this->config[$index][$item];
|
||||
}
|
||||
|
||||
return $pref;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Fetch a config file item - adds slash after item
|
||||
*
|
||||
* The second parameter allows a slash to be added to the end of
|
||||
* the item, in the case of a path.
|
||||
*
|
||||
* @access public
|
||||
* @param string the config item name
|
||||
* @param bool
|
||||
* @return string
|
||||
*/
|
||||
function slash_item($item)
|
||||
{
|
||||
if ( ! isset($this->config[$item]))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
$pref = $this->config[$item];
|
||||
|
||||
if ($pref != '' && substr($pref, -1) != '/')
|
||||
{
|
||||
$pref .= '/';
|
||||
}
|
||||
|
||||
return $pref;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Site URL
|
||||
*
|
||||
* @access public
|
||||
* @param string the URI string
|
||||
* @return string
|
||||
*/
|
||||
function site_url($uri = '')
|
||||
{
|
||||
if (is_array($uri))
|
||||
{
|
||||
$uri = implode('/', $uri);
|
||||
}
|
||||
|
||||
if ($uri == '')
|
||||
{
|
||||
return $this->slash_item('base_url').$this->item('index_page');
|
||||
}
|
||||
else
|
||||
{
|
||||
$suffix = ($this->item('url_suffix') == FALSE) ? '' : $this->item('url_suffix');
|
||||
return $this->slash_item('base_url').$this->slash_item('index_page').trim($uri, '/').$suffix;
|
||||
}
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* System URL
|
||||
*
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
function system_url()
|
||||
{
|
||||
$x = explode("/", preg_replace("|/*(.+?)/*$|", "\\1", BASEPATH));
|
||||
return $this->slash_item('base_url').end($x).'/';
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Set a config file item
|
||||
*
|
||||
* @access public
|
||||
* @param string the config item key
|
||||
* @param string the config item value
|
||||
* @return void
|
||||
*/
|
||||
function set_item($item, $value)
|
||||
{
|
||||
$this->config[$item] = $value;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// END CI_Config class
|
||||
|
||||
/* End of file Config.php */
|
||||
/* Location: ./system/libraries/Config.php */
|
||||
@@ -0,0 +1,127 @@
|
||||
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
/**
|
||||
* CodeIgniter
|
||||
*
|
||||
* An open source application development framework for PHP 4.3.2 or newer
|
||||
*
|
||||
* @package CodeIgniter
|
||||
* @author ExpressionEngine Dev Team
|
||||
* @copyright Copyright (c) 2008 - 2010, EllisLab, Inc.
|
||||
* @license http://codeigniter.com/user_guide/license.html
|
||||
* @link http://codeigniter.com
|
||||
* @since Version 1.0
|
||||
* @filesource
|
||||
*/
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* CodeIgniter Application Controller Class
|
||||
*
|
||||
* This class object is the super class that every library in
|
||||
* CodeIgniter will be assigned to.
|
||||
*
|
||||
* @package CodeIgniter
|
||||
* @subpackage Libraries
|
||||
* @category Libraries
|
||||
* @author ExpressionEngine Dev Team
|
||||
* @link http://codeigniter.com/user_guide/general/controllers.html
|
||||
*/
|
||||
class Controller extends CI_Base {
|
||||
|
||||
var $_ci_scaffolding = FALSE;
|
||||
var $_ci_scaff_table = FALSE;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* Calls the initialize() function
|
||||
*/
|
||||
function Controller()
|
||||
{
|
||||
parent::CI_Base();
|
||||
$this->_ci_initialize();
|
||||
log_message('debug', "Controller Class Initialized");
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Initialize
|
||||
*
|
||||
* Assigns all the bases classes loaded by the front controller to
|
||||
* variables in this class. Also calls the autoload routine.
|
||||
*
|
||||
* @access private
|
||||
* @return void
|
||||
*/
|
||||
function _ci_initialize()
|
||||
{
|
||||
// Assign all the class objects that were instantiated by the
|
||||
// front controller to local class variables so that CI can be
|
||||
// run as one big super object.
|
||||
$classes = array(
|
||||
'config' => 'Config',
|
||||
'input' => 'Input',
|
||||
'benchmark' => 'Benchmark',
|
||||
'uri' => 'URI',
|
||||
'output' => 'Output',
|
||||
'lang' => 'Language',
|
||||
'router' => 'Router'
|
||||
);
|
||||
|
||||
foreach ($classes as $var => $class)
|
||||
{
|
||||
$this->$var =& load_class($class);
|
||||
}
|
||||
|
||||
// In PHP 5 the Loader class is run as a discreet
|
||||
// class. In PHP 4 it extends the Controller
|
||||
if (floor(phpversion()) >= 5)
|
||||
{
|
||||
$this->load =& load_class('Loader');
|
||||
$this->load->_ci_autoloader();
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->_ci_autoloader();
|
||||
|
||||
// sync up the objects since PHP4 was working from a copy
|
||||
foreach (array_keys(get_object_vars($this)) as $attribute)
|
||||
{
|
||||
if (is_object($this->$attribute))
|
||||
{
|
||||
$this->load->$attribute =& $this->$attribute;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Run Scaffolding
|
||||
*
|
||||
* @access private
|
||||
* @return void
|
||||
*/
|
||||
function _ci_scaffolding()
|
||||
{
|
||||
if ($this->_ci_scaffolding === FALSE OR $this->_ci_scaff_table === FALSE)
|
||||
{
|
||||
show_404('Scaffolding unavailable');
|
||||
}
|
||||
|
||||
$method = ( ! in_array($this->uri->segment(3), array('add', 'insert', 'edit', 'update', 'view', 'delete', 'do_delete'), TRUE)) ? 'view' : $this->uri->segment(3);
|
||||
|
||||
require_once(BASEPATH.'scaffolding/Scaffolding'.EXT);
|
||||
$scaff = new Scaffolding($this->_ci_scaff_table);
|
||||
$scaff->$method();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
// END _Controller class
|
||||
|
||||
/* End of file Controller.php */
|
||||
/* Location: ./system/libraries/Controller.php */
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,484 @@
|
||||
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
/**
|
||||
* CodeIgniter
|
||||
*
|
||||
* An open source application development framework for PHP 4.3.2 or newer
|
||||
*
|
||||
* @package CodeIgniter
|
||||
* @author ExpressionEngine Dev Team
|
||||
* @copyright Copyright (c) 2008 - 2010, EllisLab, Inc.
|
||||
* @license http://codeigniter.com/user_guide/license.html
|
||||
* @link http://codeigniter.com
|
||||
* @since Version 1.0
|
||||
* @filesource
|
||||
*/
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* CodeIgniter Encryption Class
|
||||
*
|
||||
* Provides two-way keyed encoding using XOR Hashing and Mcrypt
|
||||
*
|
||||
* @package CodeIgniter
|
||||
* @subpackage Libraries
|
||||
* @category Libraries
|
||||
* @author ExpressionEngine Dev Team
|
||||
* @link http://codeigniter.com/user_guide/libraries/encryption.html
|
||||
*/
|
||||
class CI_Encrypt {
|
||||
|
||||
var $CI;
|
||||
var $encryption_key = '';
|
||||
var $_hash_type = 'sha1';
|
||||
var $_mcrypt_exists = FALSE;
|
||||
var $_mcrypt_cipher;
|
||||
var $_mcrypt_mode;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* Simply determines whether the mcrypt library exists.
|
||||
*
|
||||
*/
|
||||
function CI_Encrypt()
|
||||
{
|
||||
$this->CI =& get_instance();
|
||||
$this->_mcrypt_exists = ( ! function_exists('mcrypt_encrypt')) ? FALSE : TRUE;
|
||||
log_message('debug', "Encrypt Class Initialized");
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Fetch the encryption key
|
||||
*
|
||||
* Returns it as MD5 in order to have an exact-length 128 bit key.
|
||||
* Mcrypt is sensitive to keys that are not the correct length
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function get_key($key = '')
|
||||
{
|
||||
if ($key == '')
|
||||
{
|
||||
if ($this->encryption_key != '')
|
||||
{
|
||||
return $this->encryption_key;
|
||||
}
|
||||
|
||||
$CI =& get_instance();
|
||||
$key = $CI->config->item('encryption_key');
|
||||
|
||||
if ($key === FALSE)
|
||||
{
|
||||
show_error('In order to use the encryption class requires that you set an encryption key in your config file.');
|
||||
}
|
||||
}
|
||||
|
||||
return md5($key);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Set the encryption key
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @return void
|
||||
*/
|
||||
function set_key($key = '')
|
||||
{
|
||||
$this->encryption_key = $key;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Encode
|
||||
*
|
||||
* Encodes the message string using bitwise XOR encoding.
|
||||
* The key is combined with a random hash, and then it
|
||||
* too gets converted using XOR. The whole thing is then run
|
||||
* through mcrypt (if supported) using the randomized key.
|
||||
* The end result is a double-encrypted message string
|
||||
* that is randomized with each call to this function,
|
||||
* even if the supplied message and key are the same.
|
||||
*
|
||||
* @access public
|
||||
* @param string the string to encode
|
||||
* @param string the key
|
||||
* @return string
|
||||
*/
|
||||
function encode($string, $key = '')
|
||||
{
|
||||
$key = $this->get_key($key);
|
||||
$enc = $this->_xor_encode($string, $key);
|
||||
|
||||
if ($this->_mcrypt_exists === TRUE)
|
||||
{
|
||||
$enc = $this->mcrypt_encode($enc, $key);
|
||||
}
|
||||
return base64_encode($enc);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Decode
|
||||
*
|
||||
* Reverses the above process
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function decode($string, $key = '')
|
||||
{
|
||||
$key = $this->get_key($key);
|
||||
|
||||
if (preg_match('/[^a-zA-Z0-9\/\+=]/', $string))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
$dec = base64_decode($string);
|
||||
|
||||
if ($this->_mcrypt_exists === TRUE)
|
||||
{
|
||||
if (($dec = $this->mcrypt_decode($dec, $key)) === FALSE)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
return $this->_xor_decode($dec, $key);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* XOR Encode
|
||||
*
|
||||
* Takes a plain-text string and key as input and generates an
|
||||
* encoded bit-string using XOR
|
||||
*
|
||||
* @access private
|
||||
* @param string
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function _xor_encode($string, $key)
|
||||
{
|
||||
$rand = '';
|
||||
while (strlen($rand) < 32)
|
||||
{
|
||||
$rand .= mt_rand(0, mt_getrandmax());
|
||||
}
|
||||
|
||||
$rand = $this->hash($rand);
|
||||
|
||||
$enc = '';
|
||||
for ($i = 0; $i < strlen($string); $i++)
|
||||
{
|
||||
$enc .= substr($rand, ($i % strlen($rand)), 1).(substr($rand, ($i % strlen($rand)), 1) ^ substr($string, $i, 1));
|
||||
}
|
||||
|
||||
return $this->_xor_merge($enc, $key);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* XOR Decode
|
||||
*
|
||||
* Takes an encoded string and key as input and generates the
|
||||
* plain-text original message
|
||||
*
|
||||
* @access private
|
||||
* @param string
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function _xor_decode($string, $key)
|
||||
{
|
||||
$string = $this->_xor_merge($string, $key);
|
||||
|
||||
$dec = '';
|
||||
for ($i = 0; $i < strlen($string); $i++)
|
||||
{
|
||||
$dec .= (substr($string, $i++, 1) ^ substr($string, $i, 1));
|
||||
}
|
||||
|
||||
return $dec;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* XOR key + string Combiner
|
||||
*
|
||||
* Takes a string and key as input and computes the difference using XOR
|
||||
*
|
||||
* @access private
|
||||
* @param string
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function _xor_merge($string, $key)
|
||||
{
|
||||
$hash = $this->hash($key);
|
||||
$str = '';
|
||||
for ($i = 0; $i < strlen($string); $i++)
|
||||
{
|
||||
$str .= substr($string, $i, 1) ^ substr($hash, ($i % strlen($hash)), 1);
|
||||
}
|
||||
|
||||
return $str;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Encrypt using Mcrypt
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function mcrypt_encode($data, $key)
|
||||
{
|
||||
$init_size = mcrypt_get_iv_size($this->_get_cipher(), $this->_get_mode());
|
||||
$init_vect = mcrypt_create_iv($init_size, MCRYPT_RAND);
|
||||
return $this->_add_cipher_noise($init_vect.mcrypt_encrypt($this->_get_cipher(), $key, $data, $this->_get_mode(), $init_vect), $key);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Decrypt using Mcrypt
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function mcrypt_decode($data, $key)
|
||||
{
|
||||
$data = $this->_remove_cipher_noise($data, $key);
|
||||
$init_size = mcrypt_get_iv_size($this->_get_cipher(), $this->_get_mode());
|
||||
|
||||
if ($init_size > strlen($data))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
$init_vect = substr($data, 0, $init_size);
|
||||
$data = substr($data, $init_size);
|
||||
return rtrim(mcrypt_decrypt($this->_get_cipher(), $key, $data, $this->_get_mode(), $init_vect), "\0");
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Adds permuted noise to the IV + encrypted data to protect
|
||||
* against Man-in-the-middle attacks on CBC mode ciphers
|
||||
* http://www.ciphersbyritter.com/GLOSSARY.HTM#IV
|
||||
*
|
||||
* Function description
|
||||
*
|
||||
* @access private
|
||||
* @param string
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function _add_cipher_noise($data, $key)
|
||||
{
|
||||
$keyhash = $this->hash($key);
|
||||
$keylen = strlen($keyhash);
|
||||
$str = '';
|
||||
|
||||
for ($i = 0, $j = 0, $len = strlen($data); $i < $len; ++$i, ++$j)
|
||||
{
|
||||
if ($j >= $keylen)
|
||||
{
|
||||
$j = 0;
|
||||
}
|
||||
|
||||
$str .= chr((ord($data[$i]) + ord($keyhash[$j])) % 256);
|
||||
}
|
||||
|
||||
return $str;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Removes permuted noise from the IV + encrypted data, reversing
|
||||
* _add_cipher_noise()
|
||||
*
|
||||
* Function description
|
||||
*
|
||||
* @access public
|
||||
* @param type
|
||||
* @return type
|
||||
*/
|
||||
function _remove_cipher_noise($data, $key)
|
||||
{
|
||||
$keyhash = $this->hash($key);
|
||||
$keylen = strlen($keyhash);
|
||||
$str = '';
|
||||
|
||||
for ($i = 0, $j = 0, $len = strlen($data); $i < $len; ++$i, ++$j)
|
||||
{
|
||||
if ($j >= $keylen)
|
||||
{
|
||||
$j = 0;
|
||||
}
|
||||
|
||||
$temp = ord($data[$i]) - ord($keyhash[$j]);
|
||||
|
||||
if ($temp < 0)
|
||||
{
|
||||
$temp = $temp + 256;
|
||||
}
|
||||
|
||||
$str .= chr($temp);
|
||||
}
|
||||
|
||||
return $str;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Set the Mcrypt Cipher
|
||||
*
|
||||
* @access public
|
||||
* @param constant
|
||||
* @return string
|
||||
*/
|
||||
function set_cipher($cipher)
|
||||
{
|
||||
$this->_mcrypt_cipher = $cipher;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Set the Mcrypt Mode
|
||||
*
|
||||
* @access public
|
||||
* @param constant
|
||||
* @return string
|
||||
*/
|
||||
function set_mode($mode)
|
||||
{
|
||||
$this->_mcrypt_mode = $mode;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Get Mcrypt cipher Value
|
||||
*
|
||||
* @access private
|
||||
* @return string
|
||||
*/
|
||||
function _get_cipher()
|
||||
{
|
||||
if ($this->_mcrypt_cipher == '')
|
||||
{
|
||||
$this->_mcrypt_cipher = MCRYPT_RIJNDAEL_256;
|
||||
}
|
||||
|
||||
return $this->_mcrypt_cipher;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Get Mcrypt Mode Value
|
||||
*
|
||||
* @access private
|
||||
* @return string
|
||||
*/
|
||||
function _get_mode()
|
||||
{
|
||||
if ($this->_mcrypt_mode == '')
|
||||
{
|
||||
$this->_mcrypt_mode = MCRYPT_MODE_ECB;
|
||||
}
|
||||
|
||||
return $this->_mcrypt_mode;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Set the Hash type
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function set_hash($type = 'sha1')
|
||||
{
|
||||
$this->_hash_type = ($type != 'sha1' AND $type != 'md5') ? 'sha1' : $type;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Hash encode a string
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function hash($str)
|
||||
{
|
||||
return ($this->_hash_type == 'sha1') ? $this->sha1($str) : md5($str);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Generate an SHA1 Hash
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function sha1($str)
|
||||
{
|
||||
if ( ! function_exists('sha1'))
|
||||
{
|
||||
if ( ! function_exists('mhash'))
|
||||
{
|
||||
require_once(BASEPATH.'libraries/Sha1'.EXT);
|
||||
$SH = new CI_SHA;
|
||||
return $SH->generate($str);
|
||||
}
|
||||
else
|
||||
{
|
||||
return bin2hex(mhash(MHASH_SHA1, $str));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return sha1($str);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// END CI_Encrypt class
|
||||
|
||||
/* End of file Encrypt.php */
|
||||
/* Location: ./system/libraries/Encrypt.php */
|
||||
@@ -0,0 +1,174 @@
|
||||
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
/**
|
||||
* CodeIgniter
|
||||
*
|
||||
* An open source application development framework for PHP 4.3.2 or newer
|
||||
*
|
||||
* @package CodeIgniter
|
||||
* @author ExpressionEngine Dev Team
|
||||
* @copyright Copyright (c) 2008 - 2010, EllisLab, Inc.
|
||||
* @license http://codeigniter.com/user_guide/license.html
|
||||
* @link http://codeigniter.com
|
||||
* @since Version 1.0
|
||||
* @filesource
|
||||
*/
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Exceptions Class
|
||||
*
|
||||
* @package CodeIgniter
|
||||
* @subpackage Libraries
|
||||
* @category Exceptions
|
||||
* @author ExpressionEngine Dev Team
|
||||
* @link http://codeigniter.com/user_guide/libraries/exceptions.html
|
||||
*/
|
||||
class CI_Exceptions {
|
||||
var $action;
|
||||
var $severity;
|
||||
var $message;
|
||||
var $filename;
|
||||
var $line;
|
||||
var $ob_level;
|
||||
|
||||
var $levels = array(
|
||||
E_ERROR => 'Error',
|
||||
E_WARNING => 'Warning',
|
||||
E_PARSE => 'Parsing Error',
|
||||
E_NOTICE => 'Notice',
|
||||
E_CORE_ERROR => 'Core Error',
|
||||
E_CORE_WARNING => 'Core Warning',
|
||||
E_COMPILE_ERROR => 'Compile Error',
|
||||
E_COMPILE_WARNING => 'Compile Warning',
|
||||
E_USER_ERROR => 'User Error',
|
||||
E_USER_WARNING => 'User Warning',
|
||||
E_USER_NOTICE => 'User Notice',
|
||||
E_STRICT => 'Runtime Notice'
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
*/
|
||||
function CI_Exceptions()
|
||||
{
|
||||
$this->ob_level = ob_get_level();
|
||||
// Note: Do not log messages from this constructor.
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Exception Logger
|
||||
*
|
||||
* This function logs PHP generated error messages
|
||||
*
|
||||
* @access private
|
||||
* @param string the error severity
|
||||
* @param string the error string
|
||||
* @param string the error filepath
|
||||
* @param string the error line number
|
||||
* @return string
|
||||
*/
|
||||
function log_exception($severity, $message, $filepath, $line)
|
||||
{
|
||||
$severity = ( ! isset($this->levels[$severity])) ? $severity : $this->levels[$severity];
|
||||
|
||||
log_message('error', 'Severity: '.$severity.' --> '.$message. ' '.$filepath.' '.$line, TRUE);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* 404 Page Not Found Handler
|
||||
*
|
||||
* @access private
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function show_404($page = '')
|
||||
{
|
||||
$heading = "404 Page Not Found";
|
||||
$message = "The page you requested was not found.";
|
||||
|
||||
log_message('error', '404 Page Not Found --> '.$page);
|
||||
echo $this->show_error($heading, $message, 'error_404', 404);
|
||||
exit;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* General Error Page
|
||||
*
|
||||
* This function takes an error message as input
|
||||
* (either as a string or an array) and displays
|
||||
* it using the specified template.
|
||||
*
|
||||
* @access private
|
||||
* @param string the heading
|
||||
* @param string the message
|
||||
* @param string the template name
|
||||
* @return string
|
||||
*/
|
||||
function show_error($heading, $message, $template = 'error_general', $status_code = 500)
|
||||
{
|
||||
set_status_header($status_code);
|
||||
|
||||
$message = '<p>'.implode('</p><p>', ( ! is_array($message)) ? array($message) : $message).'</p>';
|
||||
|
||||
if (ob_get_level() > $this->ob_level + 1)
|
||||
{
|
||||
ob_end_flush();
|
||||
}
|
||||
ob_start();
|
||||
include(APPPATH.'errors/'.$template.EXT);
|
||||
$buffer = ob_get_contents();
|
||||
ob_end_clean();
|
||||
return $buffer;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Native PHP error handler
|
||||
*
|
||||
* @access private
|
||||
* @param string the error severity
|
||||
* @param string the error string
|
||||
* @param string the error filepath
|
||||
* @param string the error line number
|
||||
* @return string
|
||||
*/
|
||||
function show_php_error($severity, $message, $filepath, $line)
|
||||
{
|
||||
$severity = ( ! isset($this->levels[$severity])) ? $severity : $this->levels[$severity];
|
||||
|
||||
$filepath = str_replace("\\", "/", $filepath);
|
||||
|
||||
// For safety reasons we do not show the full file path
|
||||
if (FALSE !== strpos($filepath, '/'))
|
||||
{
|
||||
$x = explode('/', $filepath);
|
||||
$filepath = $x[count($x)-2].'/'.end($x);
|
||||
}
|
||||
|
||||
if (ob_get_level() > $this->ob_level + 1)
|
||||
{
|
||||
ob_end_flush();
|
||||
}
|
||||
ob_start();
|
||||
include(APPPATH.'errors/error_php'.EXT);
|
||||
$buffer = ob_get_contents();
|
||||
ob_end_clean();
|
||||
echo $buffer;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
// END Exceptions Class
|
||||
|
||||
/* End of file Exceptions.php */
|
||||
/* Location: ./system/libraries/Exceptions.php */
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,618 @@
|
||||
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
/**
|
||||
* CodeIgniter
|
||||
*
|
||||
* An open source application development framework for PHP 4.3.2 or newer
|
||||
*
|
||||
* @package CodeIgniter
|
||||
* @author ExpressionEngine Dev Team
|
||||
* @copyright Copyright (c) 2008 - 2010, EllisLab, Inc.
|
||||
* @license http://codeigniter.com/user_guide/license.html
|
||||
* @link http://codeigniter.com
|
||||
* @since Version 1.0
|
||||
* @filesource
|
||||
*/
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* FTP Class
|
||||
*
|
||||
* @package CodeIgniter
|
||||
* @subpackage Libraries
|
||||
* @category Libraries
|
||||
* @author ExpressionEngine Dev Team
|
||||
* @link http://codeigniter.com/user_guide/libraries/ftp.html
|
||||
*/
|
||||
class CI_FTP {
|
||||
|
||||
var $hostname = '';
|
||||
var $username = '';
|
||||
var $password = '';
|
||||
var $port = 21;
|
||||
var $passive = TRUE;
|
||||
var $debug = FALSE;
|
||||
var $conn_id = FALSE;
|
||||
|
||||
|
||||
/**
|
||||
* Constructor - Sets Preferences
|
||||
*
|
||||
* The constructor can be passed an array of config values
|
||||
*/
|
||||
function CI_FTP($config = array())
|
||||
{
|
||||
if (count($config) > 0)
|
||||
{
|
||||
$this->initialize($config);
|
||||
}
|
||||
|
||||
log_message('debug', "FTP Class Initialized");
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Initialize preferences
|
||||
*
|
||||
* @access public
|
||||
* @param array
|
||||
* @return void
|
||||
*/
|
||||
function initialize($config = array())
|
||||
{
|
||||
foreach ($config as $key => $val)
|
||||
{
|
||||
if (isset($this->$key))
|
||||
{
|
||||
$this->$key = $val;
|
||||
}
|
||||
}
|
||||
|
||||
// Prep the hostname
|
||||
$this->hostname = preg_replace('|.+?://|', '', $this->hostname);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* FTP Connect
|
||||
*
|
||||
* @access public
|
||||
* @param array the connection values
|
||||
* @return bool
|
||||
*/
|
||||
function connect($config = array())
|
||||
{
|
||||
if (count($config) > 0)
|
||||
{
|
||||
$this->initialize($config);
|
||||
}
|
||||
|
||||
if (FALSE === ($this->conn_id = @ftp_connect($this->hostname, $this->port)))
|
||||
{
|
||||
if ($this->debug == TRUE)
|
||||
{
|
||||
$this->_error('ftp_unable_to_connect');
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if ( ! $this->_login())
|
||||
{
|
||||
if ($this->debug == TRUE)
|
||||
{
|
||||
$this->_error('ftp_unable_to_login');
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// Set passive mode if needed
|
||||
if ($this->passive == TRUE)
|
||||
{
|
||||
ftp_pasv($this->conn_id, TRUE);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* FTP Login
|
||||
*
|
||||
* @access private
|
||||
* @return bool
|
||||
*/
|
||||
function _login()
|
||||
{
|
||||
return @ftp_login($this->conn_id, $this->username, $this->password);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Validates the connection ID
|
||||
*
|
||||
* @access private
|
||||
* @return bool
|
||||
*/
|
||||
function _is_conn()
|
||||
{
|
||||
if ( ! is_resource($this->conn_id))
|
||||
{
|
||||
if ($this->debug == TRUE)
|
||||
{
|
||||
$this->_error('ftp_no_connection');
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
|
||||
/**
|
||||
* Change directory
|
||||
*
|
||||
* The second parameter lets us momentarily turn off debugging so that
|
||||
* this function can be used to test for the existence of a folder
|
||||
* without throwing an error. There's no FTP equivalent to is_dir()
|
||||
* so we do it by trying to change to a particular directory.
|
||||
* Internally, this parameter is only used by the "mirror" function below.
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @param bool
|
||||
* @return bool
|
||||
*/
|
||||
function changedir($path = '', $supress_debug = FALSE)
|
||||
{
|
||||
if ($path == '' OR ! $this->_is_conn())
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
$result = @ftp_chdir($this->conn_id, $path);
|
||||
|
||||
if ($result === FALSE)
|
||||
{
|
||||
if ($this->debug == TRUE AND $supress_debug == FALSE)
|
||||
{
|
||||
$this->_error('ftp_unable_to_changedir');
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Create a directory
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @return bool
|
||||
*/
|
||||
function mkdir($path = '', $permissions = NULL)
|
||||
{
|
||||
if ($path == '' OR ! $this->_is_conn())
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
$result = @ftp_mkdir($this->conn_id, $path);
|
||||
|
||||
if ($result === FALSE)
|
||||
{
|
||||
if ($this->debug == TRUE)
|
||||
{
|
||||
$this->_error('ftp_unable_to_makdir');
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// Set file permissions if needed
|
||||
if ( ! is_null($permissions))
|
||||
{
|
||||
$this->chmod($path, (int)$permissions);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Upload a file to the server
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @param string
|
||||
* @param string
|
||||
* @return bool
|
||||
*/
|
||||
function upload($locpath, $rempath, $mode = 'auto', $permissions = NULL)
|
||||
{
|
||||
if ( ! $this->_is_conn())
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if ( ! file_exists($locpath))
|
||||
{
|
||||
$this->_error('ftp_no_source_file');
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// Set the mode if not specified
|
||||
if ($mode == 'auto')
|
||||
{
|
||||
// Get the file extension so we can set the upload type
|
||||
$ext = $this->_getext($locpath);
|
||||
$mode = $this->_settype($ext);
|
||||
}
|
||||
|
||||
$mode = ($mode == 'ascii') ? FTP_ASCII : FTP_BINARY;
|
||||
|
||||
$result = @ftp_put($this->conn_id, $rempath, $locpath, $mode);
|
||||
|
||||
if ($result === FALSE)
|
||||
{
|
||||
if ($this->debug == TRUE)
|
||||
{
|
||||
$this->_error('ftp_unable_to_upload');
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// Set file permissions if needed
|
||||
if ( ! is_null($permissions))
|
||||
{
|
||||
$this->chmod($rempath, (int)$permissions);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Rename (or move) a file
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @param string
|
||||
* @param bool
|
||||
* @return bool
|
||||
*/
|
||||
function rename($old_file, $new_file, $move = FALSE)
|
||||
{
|
||||
if ( ! $this->_is_conn())
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
$result = @ftp_rename($this->conn_id, $old_file, $new_file);
|
||||
|
||||
if ($result === FALSE)
|
||||
{
|
||||
if ($this->debug == TRUE)
|
||||
{
|
||||
$msg = ($move == FALSE) ? 'ftp_unable_to_rename' : 'ftp_unable_to_move';
|
||||
|
||||
$this->_error($msg);
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Move a file
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @param string
|
||||
* @return bool
|
||||
*/
|
||||
function move($old_file, $new_file)
|
||||
{
|
||||
return $this->rename($old_file, $new_file, TRUE);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Rename (or move) a file
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @return bool
|
||||
*/
|
||||
function delete_file($filepath)
|
||||
{
|
||||
if ( ! $this->_is_conn())
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
$result = @ftp_delete($this->conn_id, $filepath);
|
||||
|
||||
if ($result === FALSE)
|
||||
{
|
||||
if ($this->debug == TRUE)
|
||||
{
|
||||
$this->_error('ftp_unable_to_delete');
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Delete a folder and recursively delete everything (including sub-folders)
|
||||
* containted within it.
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @return bool
|
||||
*/
|
||||
function delete_dir($filepath)
|
||||
{
|
||||
if ( ! $this->_is_conn())
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// Add a trailing slash to the file path if needed
|
||||
$filepath = preg_replace("/(.+?)\/*$/", "\\1/", $filepath);
|
||||
|
||||
$list = $this->list_files($filepath);
|
||||
|
||||
if ($list !== FALSE AND count($list) > 0)
|
||||
{
|
||||
foreach ($list as $item)
|
||||
{
|
||||
// If we can't delete the item it's probaly a folder so
|
||||
// we'll recursively call delete_dir()
|
||||
if ( ! @ftp_delete($this->conn_id, $item))
|
||||
{
|
||||
$this->delete_dir($item);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$result = @ftp_rmdir($this->conn_id, $filepath);
|
||||
|
||||
if ($result === FALSE)
|
||||
{
|
||||
if ($this->debug == TRUE)
|
||||
{
|
||||
$this->_error('ftp_unable_to_delete');
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Set file permissions
|
||||
*
|
||||
* @access public
|
||||
* @param string the file path
|
||||
* @param string the permissions
|
||||
* @return bool
|
||||
*/
|
||||
function chmod($path, $perm)
|
||||
{
|
||||
if ( ! $this->_is_conn())
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// Permissions can only be set when running PHP 5
|
||||
if ( ! function_exists('ftp_chmod'))
|
||||
{
|
||||
if ($this->debug == TRUE)
|
||||
{
|
||||
$this->_error('ftp_unable_to_chmod');
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
$result = @ftp_chmod($this->conn_id, $perm, $path);
|
||||
|
||||
if ($result === FALSE)
|
||||
{
|
||||
if ($this->debug == TRUE)
|
||||
{
|
||||
$this->_error('ftp_unable_to_chmod');
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* FTP List files in the specified directory
|
||||
*
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
function list_files($path = '.')
|
||||
{
|
||||
if ( ! $this->_is_conn())
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return ftp_nlist($this->conn_id, $path);
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Read a directory and recreate it remotely
|
||||
*
|
||||
* This function recursively reads a folder and everything it contains (including
|
||||
* sub-folders) and creates a mirror via FTP based on it. Whatever the directory structure
|
||||
* of the original file path will be recreated on the server.
|
||||
*
|
||||
* @access public
|
||||
* @param string path to source with trailing slash
|
||||
* @param string path to destination - include the base folder with trailing slash
|
||||
* @return bool
|
||||
*/
|
||||
function mirror($locpath, $rempath)
|
||||
{
|
||||
if ( ! $this->_is_conn())
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// Open the local file path
|
||||
if ($fp = @opendir($locpath))
|
||||
{
|
||||
// Attempt to open the remote file path.
|
||||
if ( ! $this->changedir($rempath, TRUE))
|
||||
{
|
||||
// If it doesn't exist we'll attempt to create the direcotory
|
||||
if ( ! $this->mkdir($rempath) OR ! $this->changedir($rempath))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
// Recursively read the local directory
|
||||
while (FALSE !== ($file = readdir($fp)))
|
||||
{
|
||||
if (@is_dir($locpath.$file) && substr($file, 0, 1) != '.')
|
||||
{
|
||||
$this->mirror($locpath.$file."/", $rempath.$file."/");
|
||||
}
|
||||
elseif (substr($file, 0, 1) != ".")
|
||||
{
|
||||
// Get the file extension so we can se the upload type
|
||||
$ext = $this->_getext($file);
|
||||
$mode = $this->_settype($ext);
|
||||
|
||||
$this->upload($locpath.$file, $rempath.$file, $mode);
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Extract the file extension
|
||||
*
|
||||
* @access private
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function _getext($filename)
|
||||
{
|
||||
if (FALSE === strpos($filename, '.'))
|
||||
{
|
||||
return 'txt';
|
||||
}
|
||||
|
||||
$x = explode('.', $filename);
|
||||
return end($x);
|
||||
}
|
||||
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Set the upload type
|
||||
*
|
||||
* @access private
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function _settype($ext)
|
||||
{
|
||||
$text_types = array(
|
||||
'txt',
|
||||
'text',
|
||||
'php',
|
||||
'phps',
|
||||
'php4',
|
||||
'js',
|
||||
'css',
|
||||
'htm',
|
||||
'html',
|
||||
'phtml',
|
||||
'shtml',
|
||||
'log',
|
||||
'xml'
|
||||
);
|
||||
|
||||
|
||||
return (in_array($ext, $text_types)) ? 'ascii' : 'binary';
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Close the connection
|
||||
*
|
||||
* @access public
|
||||
* @param string path to source
|
||||
* @param string path to destination
|
||||
* @return bool
|
||||
*/
|
||||
function close()
|
||||
{
|
||||
if ( ! $this->_is_conn())
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@ftp_close($this->conn_id);
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Display error message
|
||||
*
|
||||
* @access private
|
||||
* @param string
|
||||
* @return bool
|
||||
*/
|
||||
function _error($line)
|
||||
{
|
||||
$CI =& get_instance();
|
||||
$CI->lang->load('ftp');
|
||||
show_error($CI->lang->line($line));
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
// END FTP Class
|
||||
|
||||
/* End of file Ftp.php */
|
||||
/* Location: ./system/libraries/Ftp.php */
|
||||
@@ -0,0 +1,226 @@
|
||||
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
/**
|
||||
* CodeIgniter
|
||||
*
|
||||
* An open source application development framework for PHP 4.3.2 or newer
|
||||
*
|
||||
* @package CodeIgniter
|
||||
* @author ExpressionEngine Dev Team
|
||||
* @copyright Copyright (c) 2008 - 2010, EllisLab, Inc.
|
||||
* @license http://codeigniter.com/user_guide/license.html
|
||||
* @link http://codeigniter.com
|
||||
* @since Version 1.0
|
||||
* @filesource
|
||||
*/
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* CodeIgniter Hooks Class
|
||||
*
|
||||
* Provides a mechanism to extend the base system without hacking. Most of
|
||||
* this class is borrowed from Paul's Extension class in ExpressionEngine.
|
||||
*
|
||||
* @package CodeIgniter
|
||||
* @subpackage Libraries
|
||||
* @category Libraries
|
||||
* @author ExpressionEngine Dev Team
|
||||
* @link http://codeigniter.com/user_guide/libraries/encryption.html
|
||||
*/
|
||||
class CI_Hooks {
|
||||
|
||||
var $enabled = FALSE;
|
||||
var $hooks = array();
|
||||
var $in_progress = FALSE;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
*/
|
||||
function CI_Hooks()
|
||||
{
|
||||
$this->_initialize();
|
||||
log_message('debug', "Hooks Class Initialized");
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Initialize the Hooks Preferences
|
||||
*
|
||||
* @access private
|
||||
* @return void
|
||||
*/
|
||||
function _initialize()
|
||||
{
|
||||
$CFG =& load_class('Config');
|
||||
|
||||
// If hooks are not enabled in the config file
|
||||
// there is nothing else to do
|
||||
|
||||
if ($CFG->item('enable_hooks') == FALSE)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Grab the "hooks" definition file.
|
||||
// If there are no hooks, we're done.
|
||||
|
||||
@include(APPPATH.'config/hooks'.EXT);
|
||||
|
||||
if ( ! isset($hook) OR ! is_array($hook))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
$this->hooks =& $hook;
|
||||
$this->enabled = TRUE;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Call Hook
|
||||
*
|
||||
* Calls a particular hook
|
||||
*
|
||||
* @access private
|
||||
* @param string the hook name
|
||||
* @return mixed
|
||||
*/
|
||||
function _call_hook($which = '')
|
||||
{
|
||||
if ( ! $this->enabled OR ! isset($this->hooks[$which]))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (isset($this->hooks[$which][0]) AND is_array($this->hooks[$which][0]))
|
||||
{
|
||||
foreach ($this->hooks[$which] as $val)
|
||||
{
|
||||
$this->_run_hook($val);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->_run_hook($this->hooks[$which]);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Run Hook
|
||||
*
|
||||
* Runs a particular hook
|
||||
*
|
||||
* @access private
|
||||
* @param array the hook details
|
||||
* @return bool
|
||||
*/
|
||||
function _run_hook($data)
|
||||
{
|
||||
if ( ! is_array($data))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// -----------------------------------
|
||||
// Safety - Prevents run-away loops
|
||||
// -----------------------------------
|
||||
|
||||
// If the script being called happens to have the same
|
||||
// hook call within it a loop can happen
|
||||
|
||||
if ($this->in_progress == TRUE)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// -----------------------------------
|
||||
// Set file path
|
||||
// -----------------------------------
|
||||
|
||||
if ( ! isset($data['filepath']) OR ! isset($data['filename']))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
$filepath = APPPATH.$data['filepath'].'/'.$data['filename'];
|
||||
|
||||
if ( ! file_exists($filepath))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// -----------------------------------
|
||||
// Set class/function name
|
||||
// -----------------------------------
|
||||
|
||||
$class = FALSE;
|
||||
$function = FALSE;
|
||||
$params = '';
|
||||
|
||||
if (isset($data['class']) AND $data['class'] != '')
|
||||
{
|
||||
$class = $data['class'];
|
||||
}
|
||||
|
||||
if (isset($data['function']))
|
||||
{
|
||||
$function = $data['function'];
|
||||
}
|
||||
|
||||
if (isset($data['params']))
|
||||
{
|
||||
$params = $data['params'];
|
||||
}
|
||||
|
||||
if ($class === FALSE AND $function === FALSE)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// -----------------------------------
|
||||
// Set the in_progress flag
|
||||
// -----------------------------------
|
||||
|
||||
$this->in_progress = TRUE;
|
||||
|
||||
// -----------------------------------
|
||||
// Call the requested class and/or function
|
||||
// -----------------------------------
|
||||
|
||||
if ($class !== FALSE)
|
||||
{
|
||||
if ( ! class_exists($class))
|
||||
{
|
||||
require($filepath);
|
||||
}
|
||||
|
||||
$HOOK = new $class;
|
||||
$HOOK->$function($params);
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( ! function_exists($function))
|
||||
{
|
||||
require($filepath);
|
||||
}
|
||||
|
||||
$function($params);
|
||||
}
|
||||
|
||||
$this->in_progress = FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// END CI_Hooks class
|
||||
|
||||
/* End of file Hooks.php */
|
||||
/* Location: ./system/libraries/Hooks.php */
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,123 @@
|
||||
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
/**
|
||||
* CodeIgniter
|
||||
*
|
||||
* An open source application development framework for PHP 4.3.2 or newer
|
||||
*
|
||||
* @package CodeIgniter
|
||||
* @author ExpressionEngine Dev Team
|
||||
* @copyright Copyright (c) 2008 - 2010, EllisLab, Inc.
|
||||
* @license http://codeigniter.com/user_guide/license.html
|
||||
* @link http://codeigniter.com
|
||||
* @since Version 1.0
|
||||
* @filesource
|
||||
*/
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Language Class
|
||||
*
|
||||
* @package CodeIgniter
|
||||
* @subpackage Libraries
|
||||
* @category Language
|
||||
* @author ExpressionEngine Dev Team
|
||||
* @link http://codeigniter.com/user_guide/libraries/language.html
|
||||
*/
|
||||
class CI_Language {
|
||||
|
||||
var $language = array();
|
||||
var $is_loaded = array();
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @access public
|
||||
*/
|
||||
function CI_Language()
|
||||
{
|
||||
log_message('debug', "Language Class Initialized");
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Load a language file
|
||||
*
|
||||
* @access public
|
||||
* @param mixed the name of the language file to be loaded. Can be an array
|
||||
* @param string the language (english, etc.)
|
||||
* @return mixed
|
||||
*/
|
||||
function load($langfile = '', $idiom = '', $return = FALSE)
|
||||
{
|
||||
$langfile = str_replace(EXT, '', str_replace('_lang.', '', $langfile)).'_lang'.EXT;
|
||||
|
||||
if (in_array($langfile, $this->is_loaded, TRUE))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if ($idiom == '')
|
||||
{
|
||||
$CI =& get_instance();
|
||||
$deft_lang = $CI->config->item('language');
|
||||
$idiom = ($deft_lang == '') ? 'english' : $deft_lang;
|
||||
}
|
||||
|
||||
// Determine where the language file is and load it
|
||||
if (file_exists(APPPATH.'language/'.$idiom.'/'.$langfile))
|
||||
{
|
||||
include(APPPATH.'language/'.$idiom.'/'.$langfile);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (file_exists(BASEPATH.'language/'.$idiom.'/'.$langfile))
|
||||
{
|
||||
include(BASEPATH.'language/'.$idiom.'/'.$langfile);
|
||||
}
|
||||
else
|
||||
{
|
||||
show_error('Unable to load the requested language file: language/'.$idiom.'/'.$langfile);
|
||||
}
|
||||
}
|
||||
|
||||
if ( ! isset($lang))
|
||||
{
|
||||
log_message('error', 'Language file contains no data: language/'.$idiom.'/'.$langfile);
|
||||
return;
|
||||
}
|
||||
|
||||
if ($return == TRUE)
|
||||
{
|
||||
return $lang;
|
||||
}
|
||||
|
||||
$this->is_loaded[] = $langfile;
|
||||
$this->language = array_merge($this->language, $lang);
|
||||
unset($lang);
|
||||
|
||||
log_message('debug', 'Language file loaded: language/'.$idiom.'/'.$langfile);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Fetch a single line of text from the language array
|
||||
*
|
||||
* @access public
|
||||
* @param string $line the language line
|
||||
* @return string
|
||||
*/
|
||||
function line($line = '')
|
||||
{
|
||||
$line = ($line == '' OR ! isset($this->language[$line])) ? FALSE : $this->language[$line];
|
||||
return $line;
|
||||
}
|
||||
|
||||
}
|
||||
// END Language Class
|
||||
|
||||
/* End of file Language.php */
|
||||
/* Location: ./system/libraries/Language.php */
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,117 @@
|
||||
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
/**
|
||||
* CodeIgniter
|
||||
*
|
||||
* An open source application development framework for PHP 4.3.2 or newer
|
||||
*
|
||||
* @package CodeIgniter
|
||||
* @author ExpressionEngine Dev Team
|
||||
* @copyright Copyright (c) 2008 - 2010, EllisLab, Inc.
|
||||
* @license http://codeigniter.com/user_guide/license.html
|
||||
* @link http://codeigniter.com
|
||||
* @since Version 1.0
|
||||
* @filesource
|
||||
*/
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Logging Class
|
||||
*
|
||||
* @package CodeIgniter
|
||||
* @subpackage Libraries
|
||||
* @category Logging
|
||||
* @author ExpressionEngine Dev Team
|
||||
* @link http://codeigniter.com/user_guide/general/errors.html
|
||||
*/
|
||||
class CI_Log {
|
||||
|
||||
var $log_path;
|
||||
var $_threshold = 1;
|
||||
var $_date_fmt = 'Y-m-d H:i:s';
|
||||
var $_enabled = TRUE;
|
||||
var $_levels = array('ERROR' => '1', 'DEBUG' => '2', 'INFO' => '3', 'ALL' => '4');
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @access public
|
||||
*/
|
||||
function CI_Log()
|
||||
{
|
||||
$config =& get_config();
|
||||
|
||||
$this->log_path = ($config['log_path'] != '') ? $config['log_path'] : BASEPATH.'logs/';
|
||||
|
||||
if ( ! is_dir($this->log_path) OR ! is_really_writable($this->log_path))
|
||||
{
|
||||
$this->_enabled = FALSE;
|
||||
}
|
||||
|
||||
if (is_numeric($config['log_threshold']))
|
||||
{
|
||||
$this->_threshold = $config['log_threshold'];
|
||||
}
|
||||
|
||||
if ($config['log_date_format'] != '')
|
||||
{
|
||||
$this->_date_fmt = $config['log_date_format'];
|
||||
}
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Write Log File
|
||||
*
|
||||
* Generally this function will be called using the global log_message() function
|
||||
*
|
||||
* @access public
|
||||
* @param string the error level
|
||||
* @param string the error message
|
||||
* @param bool whether the error is a native PHP error
|
||||
* @return bool
|
||||
*/
|
||||
function write_log($level = 'error', $msg, $php_error = FALSE)
|
||||
{
|
||||
if ($this->_enabled === FALSE)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
$level = strtoupper($level);
|
||||
|
||||
if ( ! isset($this->_levels[$level]) OR ($this->_levels[$level] > $this->_threshold))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
$filepath = $this->log_path.'log-'.date('Y-m-d').EXT;
|
||||
$message = '';
|
||||
|
||||
if ( ! file_exists($filepath))
|
||||
{
|
||||
$message .= "<"."?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); ?".">\n\n";
|
||||
}
|
||||
|
||||
if ( ! $fp = @fopen($filepath, FOPEN_WRITE_CREATE))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
$message .= $level.' '.(($level == 'INFO') ? ' -' : '-').' '.date($this->_date_fmt). ' --> '.$msg."\n";
|
||||
|
||||
flock($fp, LOCK_EX);
|
||||
fwrite($fp, $message);
|
||||
flock($fp, LOCK_UN);
|
||||
fclose($fp);
|
||||
|
||||
@chmod($filepath, FILE_WRITE_MODE);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
}
|
||||
// END Log Class
|
||||
|
||||
/* End of file Log.php */
|
||||
/* Location: ./system/libraries/Log.php */
|
||||
@@ -0,0 +1,83 @@
|
||||
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
/**
|
||||
* CodeIgniter
|
||||
*
|
||||
* An open source application development framework for PHP 4.3.2 or newer
|
||||
*
|
||||
* @package CodeIgniter
|
||||
* @author ExpressionEngine Dev Team
|
||||
* @copyright Copyright (c) 2008 - 2010, EllisLab, Inc.
|
||||
* @license http://codeigniter.com/user_guide/license.html
|
||||
* @link http://codeigniter.com
|
||||
* @since Version 1.0
|
||||
* @filesource
|
||||
*/
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* CodeIgniter Model Class
|
||||
*
|
||||
* @package CodeIgniter
|
||||
* @subpackage Libraries
|
||||
* @category Libraries
|
||||
* @author ExpressionEngine Dev Team
|
||||
* @link http://codeigniter.com/user_guide/libraries/config.html
|
||||
*/
|
||||
class Model {
|
||||
|
||||
var $_parent_name = '';
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @access public
|
||||
*/
|
||||
function Model()
|
||||
{
|
||||
// If the magic __get() or __set() methods are used in a Model references can't be used.
|
||||
$this->_assign_libraries( (method_exists($this, '__get') OR method_exists($this, '__set')) ? FALSE : TRUE );
|
||||
|
||||
// We don't want to assign the model object to itself when using the
|
||||
// assign_libraries function below so we'll grab the name of the model parent
|
||||
$this->_parent_name = ucfirst(get_class($this));
|
||||
|
||||
log_message('debug', "Model Class Initialized");
|
||||
}
|
||||
|
||||
/**
|
||||
* Assign Libraries
|
||||
*
|
||||
* Creates local references to all currently instantiated objects
|
||||
* so that any syntax that can be legally used in a controller
|
||||
* can be used within models.
|
||||
*
|
||||
* @access private
|
||||
*/
|
||||
function _assign_libraries($use_reference = TRUE)
|
||||
{
|
||||
$CI =& get_instance();
|
||||
foreach (array_keys(get_object_vars($CI)) as $key)
|
||||
{
|
||||
if ( ! isset($this->$key) AND $key != $this->_parent_name)
|
||||
{
|
||||
// In some cases using references can cause
|
||||
// problems so we'll conditionally use them
|
||||
if ($use_reference == TRUE)
|
||||
{
|
||||
$this->$key = NULL; // Needed to prevent reference errors with some configurations
|
||||
$this->$key =& $CI->$key;
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->$key = $CI->$key;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
// END Model Class
|
||||
|
||||
/* End of file Model.php */
|
||||
/* Location: ./system/libraries/Model.php */
|
||||
@@ -0,0 +1,409 @@
|
||||
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
/**
|
||||
* CodeIgniter
|
||||
*
|
||||
* An open source application development framework for PHP 4.3.2 or newer
|
||||
*
|
||||
* @package CodeIgniter
|
||||
* @author ExpressionEngine Dev Team
|
||||
* @copyright Copyright (c) 2008 - 2010, EllisLab, Inc.
|
||||
* @license http://codeigniter.com/user_guide/license.html
|
||||
* @link http://codeigniter.com
|
||||
* @since Version 1.0
|
||||
* @filesource
|
||||
*/
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Output Class
|
||||
*
|
||||
* Responsible for sending final output to browser
|
||||
*
|
||||
* @package CodeIgniter
|
||||
* @subpackage Libraries
|
||||
* @category Output
|
||||
* @author ExpressionEngine Dev Team
|
||||
* @link http://codeigniter.com/user_guide/libraries/output.html
|
||||
*/
|
||||
class CI_Output {
|
||||
|
||||
var $final_output;
|
||||
var $cache_expiration = 0;
|
||||
var $headers = array();
|
||||
var $enable_profiler = FALSE;
|
||||
|
||||
|
||||
function CI_Output()
|
||||
{
|
||||
log_message('debug', "Output Class Initialized");
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Get Output
|
||||
*
|
||||
* Returns the current output string
|
||||
*
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
function get_output()
|
||||
{
|
||||
return $this->final_output;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Set Output
|
||||
*
|
||||
* Sets the output string
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @return void
|
||||
*/
|
||||
function set_output($output)
|
||||
{
|
||||
$this->final_output = $output;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Append Output
|
||||
*
|
||||
* Appends data onto the output string
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @return void
|
||||
*/
|
||||
function append_output($output)
|
||||
{
|
||||
if ($this->final_output == '')
|
||||
{
|
||||
$this->final_output = $output;
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->final_output .= $output;
|
||||
}
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Set Header
|
||||
*
|
||||
* Lets you set a server header which will be outputted with the final display.
|
||||
*
|
||||
* Note: If a file is cached, headers will not be sent. We need to figure out
|
||||
* how to permit header data to be saved with the cache data...
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @return void
|
||||
*/
|
||||
function set_header($header, $replace = TRUE)
|
||||
{
|
||||
$this->headers[] = array($header, $replace);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Set HTTP Status Header
|
||||
* moved to Common procedural functions in 1.7.2
|
||||
*
|
||||
* @access public
|
||||
* @param int the status code
|
||||
* @param string
|
||||
* @return void
|
||||
*/
|
||||
function set_status_header($code = '200', $text = '')
|
||||
{
|
||||
set_status_header($code, $text);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Enable/disable Profiler
|
||||
*
|
||||
* @access public
|
||||
* @param bool
|
||||
* @return void
|
||||
*/
|
||||
function enable_profiler($val = TRUE)
|
||||
{
|
||||
$this->enable_profiler = (is_bool($val)) ? $val : TRUE;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Set Cache
|
||||
*
|
||||
* @access public
|
||||
* @param integer
|
||||
* @return void
|
||||
*/
|
||||
function cache($time)
|
||||
{
|
||||
$this->cache_expiration = ( ! is_numeric($time)) ? 0 : $time;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Display Output
|
||||
*
|
||||
* All "view" data is automatically put into this variable by the controller class:
|
||||
*
|
||||
* $this->final_output
|
||||
*
|
||||
* This function sends the finalized output data to the browser along
|
||||
* with any server headers and profile data. It also stops the
|
||||
* benchmark timer so the page rendering speed and memory usage can be shown.
|
||||
*
|
||||
* @access public
|
||||
* @return mixed
|
||||
*/
|
||||
function _display($output = '')
|
||||
{
|
||||
// Note: We use globals because we can't use $CI =& get_instance()
|
||||
// since this function is sometimes called by the caching mechanism,
|
||||
// which happens before the CI super object is available.
|
||||
global $BM, $CFG;
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
// Set the output data
|
||||
if ($output == '')
|
||||
{
|
||||
$output =& $this->final_output;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
// Do we need to write a cache file?
|
||||
if ($this->cache_expiration > 0)
|
||||
{
|
||||
$this->_write_cache($output);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
// Parse out the elapsed time and memory usage,
|
||||
// then swap the pseudo-variables with the data
|
||||
|
||||
$elapsed = $BM->elapsed_time('total_execution_time_start', 'total_execution_time_end');
|
||||
$output = str_replace('{elapsed_time}', $elapsed, $output);
|
||||
|
||||
$memory = ( ! function_exists('memory_get_usage')) ? '0' : round(memory_get_usage()/1024/1024, 2).'MB';
|
||||
$output = str_replace('{memory_usage}', $memory, $output);
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
// Is compression requested?
|
||||
if ($CFG->item('compress_output') === TRUE)
|
||||
{
|
||||
if (extension_loaded('zlib'))
|
||||
{
|
||||
if (isset($_SERVER['HTTP_ACCEPT_ENCODING']) AND strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== FALSE)
|
||||
{
|
||||
ob_start('ob_gzhandler');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
// Are there any server headers to send?
|
||||
if (count($this->headers) > 0)
|
||||
{
|
||||
foreach ($this->headers as $header)
|
||||
{
|
||||
@header($header[0], $header[1]);
|
||||
}
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
// Does the get_instance() function exist?
|
||||
// If not we know we are dealing with a cache file so we'll
|
||||
// simply echo out the data and exit.
|
||||
if ( ! function_exists('get_instance'))
|
||||
{
|
||||
echo $output;
|
||||
log_message('debug', "Final output sent to browser");
|
||||
log_message('debug', "Total execution time: ".$elapsed);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
// Grab the super object. We'll need it in a moment...
|
||||
$CI =& get_instance();
|
||||
|
||||
// Do we need to generate profile data?
|
||||
// If so, load the Profile class and run it.
|
||||
if ($this->enable_profiler == TRUE)
|
||||
{
|
||||
$CI->load->library('profiler');
|
||||
|
||||
// If the output data contains closing </body> and </html> tags
|
||||
// we will remove them and add them back after we insert the profile data
|
||||
if (preg_match("|</body>.*?</html>|is", $output))
|
||||
{
|
||||
$output = preg_replace("|</body>.*?</html>|is", '', $output);
|
||||
$output .= $CI->profiler->run();
|
||||
$output .= '</body></html>';
|
||||
}
|
||||
else
|
||||
{
|
||||
$output .= $CI->profiler->run();
|
||||
}
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
// Does the controller contain a function named _output()?
|
||||
// If so send the output there. Otherwise, echo it.
|
||||
if (method_exists($CI, '_output'))
|
||||
{
|
||||
$CI->_output($output);
|
||||
}
|
||||
else
|
||||
{
|
||||
echo $output; // Send it to the browser!
|
||||
}
|
||||
|
||||
log_message('debug', "Final output sent to browser");
|
||||
log_message('debug', "Total execution time: ".$elapsed);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Write a Cache File
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
function _write_cache($output)
|
||||
{
|
||||
$CI =& get_instance();
|
||||
$path = $CI->config->item('cache_path');
|
||||
|
||||
$cache_path = ($path == '') ? BASEPATH.'cache/' : $path;
|
||||
|
||||
if ( ! is_dir($cache_path) OR ! is_really_writable($cache_path))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
$uri = $CI->config->item('base_url').
|
||||
$CI->config->item('index_page').
|
||||
$CI->uri->uri_string();
|
||||
|
||||
$cache_path .= md5($uri);
|
||||
|
||||
if ( ! $fp = @fopen($cache_path, FOPEN_WRITE_CREATE_DESTRUCTIVE))
|
||||
{
|
||||
log_message('error', "Unable to write cache file: ".$cache_path);
|
||||
return;
|
||||
}
|
||||
|
||||
$expire = time() + ($this->cache_expiration * 60);
|
||||
|
||||
if (flock($fp, LOCK_EX))
|
||||
{
|
||||
fwrite($fp, $expire.'TS--->'.$output);
|
||||
flock($fp, LOCK_UN);
|
||||
}
|
||||
else
|
||||
{
|
||||
log_message('error', "Unable to secure a file lock for file at: ".$cache_path);
|
||||
return;
|
||||
}
|
||||
fclose($fp);
|
||||
@chmod($cache_path, DIR_WRITE_MODE);
|
||||
|
||||
log_message('debug', "Cache file written: ".$cache_path);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Update/serve a cached file
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
function _display_cache(&$CFG, &$URI)
|
||||
{
|
||||
$cache_path = ($CFG->item('cache_path') == '') ? BASEPATH.'cache/' : $CFG->item('cache_path');
|
||||
|
||||
if ( ! is_dir($cache_path) OR ! is_really_writable($cache_path))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// Build the file path. The file name is an MD5 hash of the full URI
|
||||
$uri = $CFG->item('base_url').
|
||||
$CFG->item('index_page').
|
||||
$URI->uri_string;
|
||||
|
||||
$filepath = $cache_path.md5($uri);
|
||||
|
||||
if ( ! @file_exists($filepath))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if ( ! $fp = @fopen($filepath, FOPEN_READ))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
flock($fp, LOCK_SH);
|
||||
|
||||
$cache = '';
|
||||
if (filesize($filepath) > 0)
|
||||
{
|
||||
$cache = fread($fp, filesize($filepath));
|
||||
}
|
||||
|
||||
flock($fp, LOCK_UN);
|
||||
fclose($fp);
|
||||
|
||||
// Strip out the embedded timestamp
|
||||
if ( ! preg_match("/(\d+TS--->)/", $cache, $match))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// Has the file expired? If so we'll delete it.
|
||||
if (time() >= trim(str_replace('TS--->', '', $match['1'])))
|
||||
{
|
||||
@unlink($filepath);
|
||||
log_message('debug', "Cache file has expired. File deleted");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// Display the cache
|
||||
$this->_display(str_replace($match['0'], '', $cache));
|
||||
log_message('debug', "Cache file is current. Sending it to browser.");
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
// END Output Class
|
||||
|
||||
/* End of file Output.php */
|
||||
/* Location: ./system/libraries/Output.php */
|
||||
@@ -0,0 +1,244 @@
|
||||
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
/**
|
||||
* CodeIgniter
|
||||
*
|
||||
* An open source application development framework for PHP 4.3.2 or newer
|
||||
*
|
||||
* @package CodeIgniter
|
||||
* @author ExpressionEngine Dev Team
|
||||
* @copyright Copyright (c) 2008 - 2010, EllisLab, Inc.
|
||||
* @license http://codeigniter.com/user_guide/license.html
|
||||
* @link http://codeigniter.com
|
||||
* @since Version 1.0
|
||||
* @filesource
|
||||
*/
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Pagination Class
|
||||
*
|
||||
* @package CodeIgniter
|
||||
* @subpackage Libraries
|
||||
* @category Pagination
|
||||
* @author ExpressionEngine Dev Team
|
||||
* @link http://codeigniter.com/user_guide/libraries/pagination.html
|
||||
*/
|
||||
class CI_Pagination {
|
||||
|
||||
var $base_url = ''; // The page we are linking to
|
||||
var $total_rows = ''; // Total number of items (database results)
|
||||
var $per_page = 10; // Max number of items you want shown per page
|
||||
var $num_links = 2; // Number of "digit" links to show before/after the currently viewed page
|
||||
var $cur_page = 0; // The current page being viewed
|
||||
var $first_link = '‹ First';
|
||||
var $next_link = '>';
|
||||
var $prev_link = '<';
|
||||
var $last_link = 'Last ›';
|
||||
var $uri_segment = 3;
|
||||
var $full_tag_open = '';
|
||||
var $full_tag_close = '';
|
||||
var $first_tag_open = '';
|
||||
var $first_tag_close = ' ';
|
||||
var $last_tag_open = ' ';
|
||||
var $last_tag_close = '';
|
||||
var $cur_tag_open = ' <strong>';
|
||||
var $cur_tag_close = '</strong>';
|
||||
var $next_tag_open = ' ';
|
||||
var $next_tag_close = ' ';
|
||||
var $prev_tag_open = ' ';
|
||||
var $prev_tag_close = '';
|
||||
var $num_tag_open = ' ';
|
||||
var $num_tag_close = '';
|
||||
var $page_query_string = FALSE;
|
||||
var $query_string_segment = 'per_page';
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @access public
|
||||
* @param array initialization parameters
|
||||
*/
|
||||
function CI_Pagination($params = array())
|
||||
{
|
||||
if (count($params) > 0)
|
||||
{
|
||||
$this->initialize($params);
|
||||
}
|
||||
|
||||
log_message('debug', "Pagination Class Initialized");
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Initialize Preferences
|
||||
*
|
||||
* @access public
|
||||
* @param array initialization parameters
|
||||
* @return void
|
||||
*/
|
||||
function initialize($params = array())
|
||||
{
|
||||
if (count($params) > 0)
|
||||
{
|
||||
foreach ($params as $key => $val)
|
||||
{
|
||||
if (isset($this->$key))
|
||||
{
|
||||
$this->$key = $val;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Generate the pagination links
|
||||
*
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
function create_links()
|
||||
{
|
||||
// If our item count or per-page total is zero there is no need to continue.
|
||||
if ($this->total_rows == 0 OR $this->per_page == 0)
|
||||
{
|
||||
return '';
|
||||
}
|
||||
|
||||
// Calculate the total number of pages
|
||||
$num_pages = ceil($this->total_rows / $this->per_page);
|
||||
|
||||
// Is there only one page? Hm... nothing more to do here then.
|
||||
if ($num_pages == 1)
|
||||
{
|
||||
return '';
|
||||
}
|
||||
|
||||
// Determine the current page number.
|
||||
$CI =& get_instance();
|
||||
|
||||
if ($CI->config->item('enable_query_strings') === TRUE OR $this->page_query_string === TRUE)
|
||||
{
|
||||
if ($CI->input->get($this->query_string_segment) != 0)
|
||||
{
|
||||
$this->cur_page = $CI->input->get($this->query_string_segment);
|
||||
|
||||
// Prep the current page - no funny business!
|
||||
$this->cur_page = (int) $this->cur_page;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ($CI->uri->segment($this->uri_segment) != 0)
|
||||
{
|
||||
$this->cur_page = $CI->uri->segment($this->uri_segment);
|
||||
|
||||
// Prep the current page - no funny business!
|
||||
$this->cur_page = (int) $this->cur_page;
|
||||
}
|
||||
}
|
||||
|
||||
$this->num_links = (int)$this->num_links;
|
||||
|
||||
if ($this->num_links < 1)
|
||||
{
|
||||
show_error('Your number of links must be a positive number.');
|
||||
}
|
||||
|
||||
if ( ! is_numeric($this->cur_page))
|
||||
{
|
||||
$this->cur_page = 0;
|
||||
}
|
||||
|
||||
// Is the page number beyond the result range?
|
||||
// If so we show the last page
|
||||
if ($this->cur_page > $this->total_rows)
|
||||
{
|
||||
$this->cur_page = ($num_pages - 1) * $this->per_page;
|
||||
}
|
||||
|
||||
$uri_page_number = $this->cur_page;
|
||||
$this->cur_page = floor(($this->cur_page/$this->per_page) + 1);
|
||||
|
||||
// Calculate the start and end numbers. These determine
|
||||
// which number to start and end the digit links with
|
||||
$start = (($this->cur_page - $this->num_links) > 0) ? $this->cur_page - ($this->num_links - 1) : 1;
|
||||
$end = (($this->cur_page + $this->num_links) < $num_pages) ? $this->cur_page + $this->num_links : $num_pages;
|
||||
|
||||
// Is pagination being used over GET or POST? If get, add a per_page query
|
||||
// string. If post, add a trailing slash to the base URL if needed
|
||||
if ($CI->config->item('enable_query_strings') === TRUE OR $this->page_query_string === TRUE)
|
||||
{
|
||||
$this->base_url = rtrim($this->base_url).'&'.$this->query_string_segment.'=';
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->base_url = rtrim($this->base_url, '/') .'/';
|
||||
}
|
||||
|
||||
// And here we go...
|
||||
$output = '';
|
||||
|
||||
// Render the "First" link
|
||||
if ($this->cur_page > ($this->num_links + 1))
|
||||
{
|
||||
$output .= $this->first_tag_open.'<a href="'.$this->base_url.'">'.$this->first_link.'</a>'.$this->first_tag_close;
|
||||
}
|
||||
|
||||
// Render the "previous" link
|
||||
if ($this->cur_page != 1)
|
||||
{
|
||||
$i = $uri_page_number - $this->per_page;
|
||||
if ($i == 0) $i = '';
|
||||
$output .= $this->prev_tag_open.'<a href="'.$this->base_url.$i.'">'.$this->prev_link.'</a>'.$this->prev_tag_close;
|
||||
}
|
||||
|
||||
// Write the digit links
|
||||
for ($loop = $start -1; $loop <= $end; $loop++)
|
||||
{
|
||||
$i = ($loop * $this->per_page) - $this->per_page;
|
||||
|
||||
if ($i >= 0)
|
||||
{
|
||||
if ($this->cur_page == $loop)
|
||||
{
|
||||
$output .= $this->cur_tag_open.$loop.$this->cur_tag_close; // Current page
|
||||
}
|
||||
else
|
||||
{
|
||||
$n = ($i == 0) ? '' : $i;
|
||||
$output .= $this->num_tag_open.'<a href="'.$this->base_url.$n.'">'.$loop.'</a>'.$this->num_tag_close;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Render the "next" link
|
||||
if ($this->cur_page < $num_pages)
|
||||
{
|
||||
$output .= $this->next_tag_open.'<a href="'.$this->base_url.($this->cur_page * $this->per_page).'">'.$this->next_link.'</a>'.$this->next_tag_close;
|
||||
}
|
||||
|
||||
// Render the "Last" link
|
||||
if (($this->cur_page + $this->num_links) < $num_pages)
|
||||
{
|
||||
$i = (($num_pages * $this->per_page) - $this->per_page);
|
||||
$output .= $this->last_tag_open.'<a href="'.$this->base_url.$i.'">'.$this->last_link.'</a>'.$this->last_tag_close;
|
||||
}
|
||||
|
||||
// Kill double slashes. Note: Sometimes we can end up with a double slash
|
||||
// in the penultimate link so we'll kill all double slashes.
|
||||
$output = preg_replace("#([^:])//+#", "\\1/", $output);
|
||||
|
||||
// Add the wrapper HTML if exists
|
||||
$output = $this->full_tag_open.$output.$this->full_tag_close;
|
||||
|
||||
return $output;
|
||||
}
|
||||
}
|
||||
// END Pagination Class
|
||||
|
||||
/* End of file Pagination.php */
|
||||
/* Location: ./system/libraries/Pagination.php */
|
||||
@@ -0,0 +1,173 @@
|
||||
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
/**
|
||||
* CodeIgniter
|
||||
*
|
||||
* An open source application development framework for PHP 4.3.2 or newer
|
||||
*
|
||||
* @package CodeIgniter
|
||||
* @author ExpressionEngine Dev Team
|
||||
* @copyright Copyright (c) 2008 - 2010, EllisLab, Inc.
|
||||
* @license http://codeigniter.com/user_guide/license.html
|
||||
* @link http://codeigniter.com
|
||||
* @since Version 1.0
|
||||
* @filesource
|
||||
*/
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Parser Class
|
||||
*
|
||||
* @package CodeIgniter
|
||||
* @subpackage Libraries
|
||||
* @category Parser
|
||||
* @author ExpressionEngine Dev Team
|
||||
* @link http://codeigniter.com/user_guide/libraries/parser.html
|
||||
*/
|
||||
class CI_Parser {
|
||||
|
||||
var $l_delim = '{';
|
||||
var $r_delim = '}';
|
||||
var $object;
|
||||
|
||||
/**
|
||||
* Parse a template
|
||||
*
|
||||
* Parses pseudo-variables contained in the specified template,
|
||||
* replacing them with the data in the second param
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @param array
|
||||
* @param bool
|
||||
* @return string
|
||||
*/
|
||||
function parse($template, $data, $return = FALSE)
|
||||
{
|
||||
$CI =& get_instance();
|
||||
$template = $CI->load->view($template, $data, TRUE);
|
||||
|
||||
if ($template == '')
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
foreach ($data as $key => $val)
|
||||
{
|
||||
if (is_array($val))
|
||||
{
|
||||
$template = $this->_parse_pair($key, $val, $template);
|
||||
}
|
||||
else
|
||||
{
|
||||
$template = $this->_parse_single($key, (string)$val, $template);
|
||||
}
|
||||
}
|
||||
|
||||
if ($return == FALSE)
|
||||
{
|
||||
$CI->output->append_output($template);
|
||||
}
|
||||
|
||||
return $template;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Set the left/right variable delimiters
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @param string
|
||||
* @return void
|
||||
*/
|
||||
function set_delimiters($l = '{', $r = '}')
|
||||
{
|
||||
$this->l_delim = $l;
|
||||
$this->r_delim = $r;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Parse a single key/value
|
||||
*
|
||||
* @access private
|
||||
* @param string
|
||||
* @param string
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function _parse_single($key, $val, $string)
|
||||
{
|
||||
return str_replace($this->l_delim.$key.$this->r_delim, $val, $string);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Parse a tag pair
|
||||
*
|
||||
* Parses tag pairs: {some_tag} string... {/some_tag}
|
||||
*
|
||||
* @access private
|
||||
* @param string
|
||||
* @param array
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function _parse_pair($variable, $data, $string)
|
||||
{
|
||||
if (FALSE === ($match = $this->_match_pair($string, $variable)))
|
||||
{
|
||||
return $string;
|
||||
}
|
||||
|
||||
$str = '';
|
||||
foreach ($data as $row)
|
||||
{
|
||||
$temp = $match['1'];
|
||||
foreach ($row as $key => $val)
|
||||
{
|
||||
if ( ! is_array($val))
|
||||
{
|
||||
$temp = $this->_parse_single($key, $val, $temp);
|
||||
}
|
||||
else
|
||||
{
|
||||
$temp = $this->_parse_pair($key, $val, $temp);
|
||||
}
|
||||
}
|
||||
|
||||
$str .= $temp;
|
||||
}
|
||||
|
||||
return str_replace($match['0'], $str, $string);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Matches a variable pair
|
||||
*
|
||||
* @access private
|
||||
* @param string
|
||||
* @param string
|
||||
* @return mixed
|
||||
*/
|
||||
function _match_pair($string, $variable)
|
||||
{
|
||||
if ( ! preg_match("|".$this->l_delim . $variable . $this->r_delim."(.+?)".$this->l_delim . '/' . $variable . $this->r_delim."|s", $string, $match))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return $match;
|
||||
}
|
||||
|
||||
}
|
||||
// END Parser Class
|
||||
|
||||
/* End of file Parser.php */
|
||||
/* Location: ./system/libraries/Parser.php */
|
||||
@@ -0,0 +1,392 @@
|
||||
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
/**
|
||||
* CodeIgniter
|
||||
*
|
||||
* An open source application development framework for PHP 4.3.2 or newer
|
||||
*
|
||||
* @package CodeIgniter
|
||||
* @author ExpressionEngine Dev Team
|
||||
* @copyright Copyright (c) 2008 - 2010, EllisLab, Inc.
|
||||
* @license http://codeigniter.com/user_guide/license.html
|
||||
* @link http://codeigniter.com
|
||||
* @since Version 1.0
|
||||
* @filesource
|
||||
*/
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* CodeIgniter Profiler Class
|
||||
*
|
||||
* This class enables you to display benchmark, query, and other data
|
||||
* in order to help with debugging and optimization.
|
||||
*
|
||||
* Note: At some point it would be good to move all the HTML in this class
|
||||
* into a set of template files in order to allow customization.
|
||||
*
|
||||
* @package CodeIgniter
|
||||
* @subpackage Libraries
|
||||
* @category Libraries
|
||||
* @author ExpressionEngine Dev Team
|
||||
* @link http://codeigniter.com/user_guide/general/profiling.html
|
||||
*/
|
||||
class CI_Profiler {
|
||||
|
||||
var $CI;
|
||||
|
||||
function CI_Profiler()
|
||||
{
|
||||
$this->CI =& get_instance();
|
||||
$this->CI->load->language('profiler');
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Auto Profiler
|
||||
*
|
||||
* This function cycles through the entire array of mark points and
|
||||
* matches any two points that are named identically (ending in "_start"
|
||||
* and "_end" respectively). It then compiles the execution times for
|
||||
* all points and returns it as an array
|
||||
*
|
||||
* @access private
|
||||
* @return array
|
||||
*/
|
||||
function _compile_benchmarks()
|
||||
{
|
||||
$profile = array();
|
||||
foreach ($this->CI->benchmark->marker as $key => $val)
|
||||
{
|
||||
// We match the "end" marker so that the list ends
|
||||
// up in the order that it was defined
|
||||
if (preg_match("/(.+?)_end/i", $key, $match))
|
||||
{
|
||||
if (isset($this->CI->benchmark->marker[$match[1].'_end']) AND isset($this->CI->benchmark->marker[$match[1].'_start']))
|
||||
{
|
||||
$profile[$match[1]] = $this->CI->benchmark->elapsed_time($match[1].'_start', $key);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Build a table containing the profile data.
|
||||
// Note: At some point we should turn this into a template that can
|
||||
// be modified. We also might want to make this data available to be logged
|
||||
|
||||
$output = "\n\n";
|
||||
$output .= '<fieldset style="border:1px solid #990000;padding:6px 10px 10px 10px;margin:0 0 20px 0;background-color:#eee">';
|
||||
$output .= "\n";
|
||||
$output .= '<legend style="color:#990000;"> '.$this->CI->lang->line('profiler_benchmarks').' </legend>';
|
||||
$output .= "\n";
|
||||
$output .= "\n\n<table cellpadding='4' cellspacing='1' border='0' width='100%'>\n";
|
||||
|
||||
foreach ($profile as $key => $val)
|
||||
{
|
||||
$key = ucwords(str_replace(array('_', '-'), ' ', $key));
|
||||
$output .= "<tr><td width='50%' style='color:#000;font-weight:bold;background-color:#ddd;'>".$key." </td><td width='50%' style='color:#990000;font-weight:normal;background-color:#ddd;'>".$val."</td></tr>\n";
|
||||
}
|
||||
|
||||
$output .= "</table>\n";
|
||||
$output .= "</fieldset>";
|
||||
|
||||
return $output;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Compile Queries
|
||||
*
|
||||
* @access private
|
||||
* @return string
|
||||
*/
|
||||
function _compile_queries()
|
||||
{
|
||||
$dbs = array();
|
||||
|
||||
// Let's determine which databases are currently connected to
|
||||
foreach (get_object_vars($this->CI) as $CI_object)
|
||||
{
|
||||
if (is_object($CI_object) && is_subclass_of(get_class($CI_object), 'CI_DB') )
|
||||
{
|
||||
$dbs[] = $CI_object;
|
||||
}
|
||||
}
|
||||
|
||||
if (count($dbs) == 0)
|
||||
{
|
||||
$output = "\n\n";
|
||||
$output .= '<fieldset style="border:1px solid #0000FF;padding:6px 10px 10px 10px;margin:20px 0 20px 0;background-color:#eee">';
|
||||
$output .= "\n";
|
||||
$output .= '<legend style="color:#0000FF;"> '.$this->CI->lang->line('profiler_queries').' </legend>';
|
||||
$output .= "\n";
|
||||
$output .= "\n\n<table cellpadding='4' cellspacing='1' border='0' width='100%'>\n";
|
||||
$output .="<tr><td width='100%' style='color:#0000FF;font-weight:normal;background-color:#eee;'>".$this->CI->lang->line('profiler_no_db')."</td></tr>\n";
|
||||
$output .= "</table>\n";
|
||||
$output .= "</fieldset>";
|
||||
|
||||
return $output;
|
||||
}
|
||||
|
||||
// Load the text helper so we can highlight the SQL
|
||||
$this->CI->load->helper('text');
|
||||
|
||||
// Key words we want bolded
|
||||
$highlight = array('SELECT', 'DISTINCT', 'FROM', 'WHERE', 'AND', 'LEFT JOIN', 'ORDER BY', 'GROUP BY', 'LIMIT', 'INSERT', 'INTO', 'VALUES', 'UPDATE', 'OR', 'HAVING', 'OFFSET', 'NOT IN', 'IN', 'LIKE', 'NOT LIKE', 'COUNT', 'MAX', 'MIN', 'ON', 'AS', 'AVG', 'SUM', '(', ')');
|
||||
|
||||
$output = "\n\n";
|
||||
|
||||
foreach ($dbs as $db)
|
||||
{
|
||||
$output .= '<fieldset style="border:1px solid #0000FF;padding:6px 10px 10px 10px;margin:20px 0 20px 0;background-color:#eee">';
|
||||
$output .= "\n";
|
||||
$output .= '<legend style="color:#0000FF;"> '.$this->CI->lang->line('profiler_database').': '.$db->database.' '.$this->CI->lang->line('profiler_queries').': '.count($this->CI->db->queries).' </legend>';
|
||||
$output .= "\n";
|
||||
$output .= "\n\n<table cellpadding='4' cellspacing='1' border='0' width='100%'>\n";
|
||||
|
||||
if (count($db->queries) == 0)
|
||||
{
|
||||
$output .= "<tr><td width='100%' style='color:#0000FF;font-weight:normal;background-color:#eee;'>".$this->CI->lang->line('profiler_no_queries')."</td></tr>\n";
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach ($db->queries as $key => $val)
|
||||
{
|
||||
$time = number_format($db->query_times[$key], 4);
|
||||
|
||||
$val = highlight_code($val, ENT_QUOTES);
|
||||
|
||||
foreach ($highlight as $bold)
|
||||
{
|
||||
$val = str_replace($bold, '<strong>'.$bold.'</strong>', $val);
|
||||
}
|
||||
|
||||
$output .= "<tr><td width='1%' valign='top' style='color:#990000;font-weight:normal;background-color:#ddd;'>".$time." </td><td style='color:#000;font-weight:normal;background-color:#ddd;'>".$val."</td></tr>\n";
|
||||
}
|
||||
}
|
||||
|
||||
$output .= "</table>\n";
|
||||
$output .= "</fieldset>";
|
||||
|
||||
}
|
||||
|
||||
return $output;
|
||||
}
|
||||
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Compile $_GET Data
|
||||
*
|
||||
* @access private
|
||||
* @return string
|
||||
*/
|
||||
function _compile_get()
|
||||
{
|
||||
$output = "\n\n";
|
||||
$output .= '<fieldset style="border:1px solid #cd6e00;padding:6px 10px 10px 10px;margin:20px 0 20px 0;background-color:#eee">';
|
||||
$output .= "\n";
|
||||
$output .= '<legend style="color:#cd6e00;"> '.$this->CI->lang->line('profiler_get_data').' </legend>';
|
||||
$output .= "\n";
|
||||
|
||||
if (count($_GET) == 0)
|
||||
{
|
||||
$output .= "<div style='color:#cd6e00;font-weight:normal;padding:4px 0 4px 0'>".$this->CI->lang->line('profiler_no_get')."</div>";
|
||||
}
|
||||
else
|
||||
{
|
||||
$output .= "\n\n<table cellpadding='4' cellspacing='1' border='0' width='100%'>\n";
|
||||
|
||||
foreach ($_GET as $key => $val)
|
||||
{
|
||||
if ( ! is_numeric($key))
|
||||
{
|
||||
$key = "'".$key."'";
|
||||
}
|
||||
|
||||
$output .= "<tr><td width='50%' style='color:#000;background-color:#ddd;'>$_GET[".$key."] </td><td width='50%' style='color:#cd6e00;font-weight:normal;background-color:#ddd;'>";
|
||||
if (is_array($val))
|
||||
{
|
||||
$output .= "<pre>" . htmlspecialchars(stripslashes(print_r($val, true))) . "</pre>";
|
||||
}
|
||||
else
|
||||
{
|
||||
$output .= htmlspecialchars(stripslashes($val));
|
||||
}
|
||||
$output .= "</td></tr>\n";
|
||||
}
|
||||
|
||||
$output .= "</table>\n";
|
||||
}
|
||||
$output .= "</fieldset>";
|
||||
|
||||
return $output;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Compile $_POST Data
|
||||
*
|
||||
* @access private
|
||||
* @return string
|
||||
*/
|
||||
function _compile_post()
|
||||
{
|
||||
$output = "\n\n";
|
||||
$output .= '<fieldset style="border:1px solid #009900;padding:6px 10px 10px 10px;margin:20px 0 20px 0;background-color:#eee">';
|
||||
$output .= "\n";
|
||||
$output .= '<legend style="color:#009900;"> '.$this->CI->lang->line('profiler_post_data').' </legend>';
|
||||
$output .= "\n";
|
||||
|
||||
if (count($_POST) == 0)
|
||||
{
|
||||
$output .= "<div style='color:#009900;font-weight:normal;padding:4px 0 4px 0'>".$this->CI->lang->line('profiler_no_post')."</div>";
|
||||
}
|
||||
else
|
||||
{
|
||||
$output .= "\n\n<table cellpadding='4' cellspacing='1' border='0' width='100%'>\n";
|
||||
|
||||
foreach ($_POST as $key => $val)
|
||||
{
|
||||
if ( ! is_numeric($key))
|
||||
{
|
||||
$key = "'".$key."'";
|
||||
}
|
||||
|
||||
$output .= "<tr><td width='50%' style='color:#000;background-color:#ddd;'>$_POST[".$key."] </td><td width='50%' style='color:#009900;font-weight:normal;background-color:#ddd;'>";
|
||||
if (is_array($val))
|
||||
{
|
||||
$output .= "<pre>" . htmlspecialchars(stripslashes(print_r($val, true))) . "</pre>";
|
||||
}
|
||||
else
|
||||
{
|
||||
$output .= htmlspecialchars(stripslashes($val));
|
||||
}
|
||||
$output .= "</td></tr>\n";
|
||||
}
|
||||
|
||||
$output .= "</table>\n";
|
||||
}
|
||||
$output .= "</fieldset>";
|
||||
|
||||
return $output;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Show query string
|
||||
*
|
||||
* @access private
|
||||
* @return string
|
||||
*/
|
||||
function _compile_uri_string()
|
||||
{
|
||||
$output = "\n\n";
|
||||
$output .= '<fieldset style="border:1px solid #000;padding:6px 10px 10px 10px;margin:20px 0 20px 0;background-color:#eee">';
|
||||
$output .= "\n";
|
||||
$output .= '<legend style="color:#000;"> '.$this->CI->lang->line('profiler_uri_string').' </legend>';
|
||||
$output .= "\n";
|
||||
|
||||
if ($this->CI->uri->uri_string == '')
|
||||
{
|
||||
$output .= "<div style='color:#000;font-weight:normal;padding:4px 0 4px 0'>".$this->CI->lang->line('profiler_no_uri')."</div>";
|
||||
}
|
||||
else
|
||||
{
|
||||
$output .= "<div style='color:#000;font-weight:normal;padding:4px 0 4px 0'>".$this->CI->uri->uri_string."</div>";
|
||||
}
|
||||
|
||||
$output .= "</fieldset>";
|
||||
|
||||
return $output;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Show the controller and function that were called
|
||||
*
|
||||
* @access private
|
||||
* @return string
|
||||
*/
|
||||
function _compile_controller_info()
|
||||
{
|
||||
$output = "\n\n";
|
||||
$output .= '<fieldset style="border:1px solid #995300;padding:6px 10px 10px 10px;margin:20px 0 20px 0;background-color:#eee">';
|
||||
$output .= "\n";
|
||||
$output .= '<legend style="color:#995300;"> '.$this->CI->lang->line('profiler_controller_info').' </legend>';
|
||||
$output .= "\n";
|
||||
|
||||
$output .= "<div style='color:#995300;font-weight:normal;padding:4px 0 4px 0'>".$this->CI->router->fetch_class()."/".$this->CI->router->fetch_method()."</div>";
|
||||
|
||||
|
||||
$output .= "</fieldset>";
|
||||
|
||||
return $output;
|
||||
}
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Compile memory usage
|
||||
*
|
||||
* Display total used memory
|
||||
*
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
function _compile_memory_usage()
|
||||
{
|
||||
$output = "\n\n";
|
||||
$output .= '<fieldset style="border:1px solid #5a0099;padding:6px 10px 10px 10px;margin:20px 0 20px 0;background-color:#eee">';
|
||||
$output .= "\n";
|
||||
$output .= '<legend style="color:#5a0099;"> '.$this->CI->lang->line('profiler_memory_usage').' </legend>';
|
||||
$output .= "\n";
|
||||
|
||||
if (function_exists('memory_get_usage') && ($usage = memory_get_usage()) != '')
|
||||
{
|
||||
$output .= "<div style='color:#5a0099;font-weight:normal;padding:4px 0 4px 0'>".number_format($usage).' bytes</div>';
|
||||
}
|
||||
else
|
||||
{
|
||||
$output .= "<div style='color:#5a0099;font-weight:normal;padding:4px 0 4px 0'>".$this->CI->lang->line('profiler_no_memory_usage')."</div>";
|
||||
}
|
||||
|
||||
$output .= "</fieldset>";
|
||||
|
||||
return $output;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Run the Profiler
|
||||
*
|
||||
* @access private
|
||||
* @return string
|
||||
*/
|
||||
function run()
|
||||
{
|
||||
$output = "<div id='codeigniter_profiler' style='clear:both;background-color:#fff;padding:10px;'>";
|
||||
|
||||
$output .= $this->_compile_uri_string();
|
||||
$output .= $this->_compile_controller_info();
|
||||
$output .= $this->_compile_memory_usage();
|
||||
$output .= $this->_compile_benchmarks();
|
||||
$output .= $this->_compile_get();
|
||||
$output .= $this->_compile_post();
|
||||
$output .= $this->_compile_queries();
|
||||
|
||||
$output .= '</div>';
|
||||
|
||||
return $output;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// END CI_Profiler class
|
||||
|
||||
/* End of file Profiler.php */
|
||||
/* Location: ./system/libraries/Profiler.php */
|
||||
@@ -0,0 +1,389 @@
|
||||
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
/**
|
||||
* CodeIgniter
|
||||
*
|
||||
* An open source application development framework for PHP 4.3.2 or newer
|
||||
*
|
||||
* @package CodeIgniter
|
||||
* @author ExpressionEngine Dev Team
|
||||
* @copyright Copyright (c) 2008 - 2010, EllisLab, Inc.
|
||||
* @license http://codeigniter.com/user_guide/license.html
|
||||
* @link http://codeigniter.com
|
||||
* @since Version 1.0
|
||||
* @filesource
|
||||
*/
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Router Class
|
||||
*
|
||||
* Parses URIs and determines routing
|
||||
*
|
||||
* @package CodeIgniter
|
||||
* @subpackage Libraries
|
||||
* @author ExpressionEngine Dev Team
|
||||
* @category Libraries
|
||||
* @link http://codeigniter.com/user_guide/general/routing.html
|
||||
*/
|
||||
class CI_Router {
|
||||
|
||||
var $config;
|
||||
var $routes = array();
|
||||
var $error_routes = array();
|
||||
var $class = '';
|
||||
var $method = 'index';
|
||||
var $directory = '';
|
||||
var $uri_protocol = 'auto';
|
||||
var $default_controller;
|
||||
var $scaffolding_request = FALSE; // Must be set to FALSE
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* Runs the route mapping function.
|
||||
*/
|
||||
function CI_Router()
|
||||
{
|
||||
$this->config =& load_class('Config');
|
||||
$this->uri =& load_class('URI');
|
||||
$this->_set_routing();
|
||||
log_message('debug', "Router Class Initialized");
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Set the route mapping
|
||||
*
|
||||
* This function determines what should be served based on the URI request,
|
||||
* as well as any "routes" that have been set in the routing config file.
|
||||
*
|
||||
* @access private
|
||||
* @return void
|
||||
*/
|
||||
function _set_routing()
|
||||
{
|
||||
// Are query strings enabled in the config file?
|
||||
// If so, we're done since segment based URIs are not used with query strings.
|
||||
if ($this->config->item('enable_query_strings') === TRUE AND isset($_GET[$this->config->item('controller_trigger')]))
|
||||
{
|
||||
$this->set_class(trim($this->uri->_filter_uri($_GET[$this->config->item('controller_trigger')])));
|
||||
|
||||
if (isset($_GET[$this->config->item('function_trigger')]))
|
||||
{
|
||||
$this->set_method(trim($this->uri->_filter_uri($_GET[$this->config->item('function_trigger')])));
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// Load the routes.php file.
|
||||
@include(APPPATH.'config/routes'.EXT);
|
||||
$this->routes = ( ! isset($route) OR ! is_array($route)) ? array() : $route;
|
||||
unset($route);
|
||||
|
||||
// Set the default controller so we can display it in the event
|
||||
// the URI doesn't correlated to a valid controller.
|
||||
$this->default_controller = ( ! isset($this->routes['default_controller']) OR $this->routes['default_controller'] == '') ? FALSE : strtolower($this->routes['default_controller']);
|
||||
|
||||
// Fetch the complete URI string
|
||||
$this->uri->_fetch_uri_string();
|
||||
|
||||
// Is there a URI string? If not, the default controller specified in the "routes" file will be shown.
|
||||
if ($this->uri->uri_string == '')
|
||||
{
|
||||
if ($this->default_controller === FALSE)
|
||||
{
|
||||
show_error("Unable to determine what should be displayed. A default route has not been specified in the routing file.");
|
||||
}
|
||||
|
||||
if (strpos($this->default_controller, '/') !== FALSE)
|
||||
{
|
||||
$x = explode('/', $this->default_controller);
|
||||
|
||||
$this->set_class(end($x));
|
||||
$this->set_method('index');
|
||||
$this->_set_request($x);
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->set_class($this->default_controller);
|
||||
$this->set_method('index');
|
||||
$this->_set_request(array($this->default_controller, 'index'));
|
||||
}
|
||||
|
||||
// re-index the routed segments array so it starts with 1 rather than 0
|
||||
$this->uri->_reindex_segments();
|
||||
|
||||
log_message('debug', "No URI present. Default controller set.");
|
||||
return;
|
||||
}
|
||||
unset($this->routes['default_controller']);
|
||||
|
||||
// Do we need to remove the URL suffix?
|
||||
$this->uri->_remove_url_suffix();
|
||||
|
||||
// Compile the segments into an array
|
||||
$this->uri->_explode_segments();
|
||||
|
||||
// Parse any custom routing that may exist
|
||||
$this->_parse_routes();
|
||||
|
||||
// Re-index the segment array so that it starts with 1 rather than 0
|
||||
$this->uri->_reindex_segments();
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Set the Route
|
||||
*
|
||||
* This function takes an array of URI segments as
|
||||
* input, and sets the current class/method
|
||||
*
|
||||
* @access private
|
||||
* @param array
|
||||
* @param bool
|
||||
* @return void
|
||||
*/
|
||||
function _set_request($segments = array())
|
||||
{
|
||||
$segments = $this->_validate_request($segments);
|
||||
|
||||
if (count($segments) == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
$this->set_class($segments[0]);
|
||||
|
||||
if (isset($segments[1]))
|
||||
{
|
||||
// A scaffolding request. No funny business with the URL
|
||||
if ($this->routes['scaffolding_trigger'] == $segments[1] AND $segments[1] != '_ci_scaffolding')
|
||||
{
|
||||
$this->scaffolding_request = TRUE;
|
||||
unset($this->routes['scaffolding_trigger']);
|
||||
}
|
||||
else
|
||||
{
|
||||
// A standard method request
|
||||
$this->set_method($segments[1]);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// This lets the "routed" segment array identify that the default
|
||||
// index method is being used.
|
||||
$segments[1] = 'index';
|
||||
}
|
||||
|
||||
// Update our "routed" segment array to contain the segments.
|
||||
// Note: If there is no custom routing, this array will be
|
||||
// identical to $this->uri->segments
|
||||
$this->uri->rsegments = $segments;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Validates the supplied segments. Attempts to determine the path to
|
||||
* the controller.
|
||||
*
|
||||
* @access private
|
||||
* @param array
|
||||
* @return array
|
||||
*/
|
||||
function _validate_request($segments)
|
||||
{
|
||||
// Does the requested controller exist in the root folder?
|
||||
if (file_exists(APPPATH.'controllers/'.$segments[0].EXT))
|
||||
{
|
||||
return $segments;
|
||||
}
|
||||
|
||||
// Is the controller in a sub-folder?
|
||||
if (is_dir(APPPATH.'controllers/'.$segments[0]))
|
||||
{
|
||||
// Set the directory and remove it from the segment array
|
||||
$this->set_directory($segments[0]);
|
||||
$segments = array_slice($segments, 1);
|
||||
|
||||
if (count($segments) > 0)
|
||||
{
|
||||
// Does the requested controller exist in the sub-folder?
|
||||
if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$segments[0].EXT))
|
||||
{
|
||||
show_404($this->fetch_directory().$segments[0]);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->set_class($this->default_controller);
|
||||
$this->set_method('index');
|
||||
|
||||
// Does the default controller exist in the sub-folder?
|
||||
if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$this->default_controller.EXT))
|
||||
{
|
||||
$this->directory = '';
|
||||
return array();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return $segments;
|
||||
}
|
||||
|
||||
// Can't find the requested controller...
|
||||
show_404($segments[0]);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Parse Routes
|
||||
*
|
||||
* This function matches any routes that may exist in
|
||||
* the config/routes.php file against the URI to
|
||||
* determine if the class/method need to be remapped.
|
||||
*
|
||||
* @access private
|
||||
* @return void
|
||||
*/
|
||||
function _parse_routes()
|
||||
{
|
||||
// Do we even have any custom routing to deal with?
|
||||
// There is a default scaffolding trigger, so we'll look just for 1
|
||||
if (count($this->routes) == 1)
|
||||
{
|
||||
$this->_set_request($this->uri->segments);
|
||||
return;
|
||||
}
|
||||
|
||||
// Turn the segment array into a URI string
|
||||
$uri = implode('/', $this->uri->segments);
|
||||
|
||||
// Is there a literal match? If so we're done
|
||||
if (isset($this->routes[$uri]))
|
||||
{
|
||||
$this->_set_request(explode('/', $this->routes[$uri]));
|
||||
return;
|
||||
}
|
||||
|
||||
// Loop through the route array looking for wild-cards
|
||||
foreach ($this->routes as $key => $val)
|
||||
{
|
||||
// Convert wild-cards to RegEx
|
||||
$key = str_replace(':any', '.+', str_replace(':num', '[0-9]+', $key));
|
||||
|
||||
// Does the RegEx match?
|
||||
if (preg_match('#^'.$key.'$#', $uri))
|
||||
{
|
||||
// Do we have a back-reference?
|
||||
if (strpos($val, '$') !== FALSE AND strpos($key, '(') !== FALSE)
|
||||
{
|
||||
$val = preg_replace('#^'.$key.'$#', $val, $uri);
|
||||
}
|
||||
|
||||
$this->_set_request(explode('/', $val));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// If we got this far it means we didn't encounter a
|
||||
// matching route so we'll set the site default route
|
||||
$this->_set_request($this->uri->segments);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Set the class name
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @return void
|
||||
*/
|
||||
function set_class($class)
|
||||
{
|
||||
$this->class = str_replace(array('/', '.'), '', $class);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Fetch the current class
|
||||
*
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
function fetch_class()
|
||||
{
|
||||
return $this->class;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Set the method name
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @return void
|
||||
*/
|
||||
function set_method($method)
|
||||
{
|
||||
$this->method = $method;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Fetch the current method
|
||||
*
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
function fetch_method()
|
||||
{
|
||||
if ($this->method == $this->fetch_class())
|
||||
{
|
||||
return 'index';
|
||||
}
|
||||
|
||||
return $this->method;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Set the directory name
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @return void
|
||||
*/
|
||||
function set_directory($dir)
|
||||
{
|
||||
$this->directory = str_replace(array('/', '.'), '', $dir).'/';
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Fetch the sub-directory (if any) that contains the requested controller class
|
||||
*
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
function fetch_directory()
|
||||
{
|
||||
return $this->directory;
|
||||
}
|
||||
|
||||
}
|
||||
// END Router Class
|
||||
|
||||
/* End of file Router.php */
|
||||
/* Location: ./system/libraries/Router.php */
|
||||
@@ -0,0 +1,758 @@
|
||||
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
/**
|
||||
* CodeIgniter
|
||||
*
|
||||
* An open source application development framework for PHP 4.3.2 or newer
|
||||
*
|
||||
* @package CodeIgniter
|
||||
* @author ExpressionEngine Dev Team
|
||||
* @copyright Copyright (c) 2008 - 2010, EllisLab, Inc.
|
||||
* @license http://codeigniter.com/user_guide/license.html
|
||||
* @link http://codeigniter.com
|
||||
* @since Version 1.0
|
||||
* @filesource
|
||||
*/
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Session Class
|
||||
*
|
||||
* @package CodeIgniter
|
||||
* @subpackage Libraries
|
||||
* @category Sessions
|
||||
* @author ExpressionEngine Dev Team
|
||||
* @link http://codeigniter.com/user_guide/libraries/sessions.html
|
||||
*/
|
||||
class CI_Session {
|
||||
|
||||
var $sess_encrypt_cookie = FALSE;
|
||||
var $sess_use_database = FALSE;
|
||||
var $sess_table_name = '';
|
||||
var $sess_expiration = 7200;
|
||||
var $sess_match_ip = FALSE;
|
||||
var $sess_match_useragent = TRUE;
|
||||
var $sess_cookie_name = 'ci_session';
|
||||
var $cookie_prefix = '';
|
||||
var $cookie_path = '';
|
||||
var $cookie_domain = '';
|
||||
var $sess_time_to_update = 300;
|
||||
var $encryption_key = '';
|
||||
var $flashdata_key = 'flash';
|
||||
var $time_reference = 'time';
|
||||
var $gc_probability = 5;
|
||||
var $userdata = array();
|
||||
var $CI;
|
||||
var $now;
|
||||
|
||||
/**
|
||||
* Session Constructor
|
||||
*
|
||||
* The constructor runs the session routines automatically
|
||||
* whenever the class is instantiated.
|
||||
*/
|
||||
function CI_Session($params = array())
|
||||
{
|
||||
log_message('debug', "Session Class Initialized");
|
||||
|
||||
// Set the super object to a local variable for use throughout the class
|
||||
$this->CI =& get_instance();
|
||||
|
||||
// Set all the session preferences, which can either be set
|
||||
// manually via the $params array above or via the config file
|
||||
foreach (array('sess_encrypt_cookie', 'sess_use_database', 'sess_table_name', 'sess_expiration', 'sess_match_ip', 'sess_match_useragent', 'sess_cookie_name', 'cookie_path', 'cookie_domain', 'sess_time_to_update', 'time_reference', 'cookie_prefix', 'encryption_key') as $key)
|
||||
{
|
||||
$this->$key = (isset($params[$key])) ? $params[$key] : $this->CI->config->item($key);
|
||||
}
|
||||
|
||||
// Load the string helper so we can use the strip_slashes() function
|
||||
$this->CI->load->helper('string');
|
||||
|
||||
// Do we need encryption? If so, load the encryption class
|
||||
if ($this->sess_encrypt_cookie == TRUE)
|
||||
{
|
||||
$this->CI->load->library('encrypt');
|
||||
}
|
||||
|
||||
// Are we using a database? If so, load it
|
||||
if ($this->sess_use_database === TRUE AND $this->sess_table_name != '')
|
||||
{
|
||||
$this->CI->load->database();
|
||||
}
|
||||
|
||||
// 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 'old' flashdata (from last request)
|
||||
$this->_flashdata_sweep();
|
||||
|
||||
// Mark all new flashdata as old (data will be deleted before next request)
|
||||
$this->_flashdata_mark();
|
||||
|
||||
// Delete expired sessions if necessary
|
||||
$this->_sess_gc();
|
||||
|
||||
log_message('debug', "Session routines successfully run");
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Fetch the current session data if it exists
|
||||
*
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
function sess_read()
|
||||
{
|
||||
// Fetch the cookie
|
||||
$session = $this->CI->input->cookie($this->sess_cookie_name);
|
||||
|
||||
// No cookie? Goodbye cruel world!...
|
||||
if ($session === FALSE)
|
||||
{
|
||||
log_message('debug', 'A session cookie was not found.');
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// Decrypt the cookie data
|
||||
if ($this->sess_encrypt_cookie == TRUE)
|
||||
{
|
||||
$session = $this->CI->encrypt->decode($session);
|
||||
}
|
||||
else
|
||||
{
|
||||
// encryption was not used, so we need to check the md5 hash
|
||||
$hash = substr($session, strlen($session)-32); // get last 32 chars
|
||||
$session = substr($session, 0, strlen($session)-32);
|
||||
|
||||
// Does the md5 hash match? This is to prevent manipulation of session data in userspace
|
||||
if ($hash !== md5($session.$this->encryption_key))
|
||||
{
|
||||
log_message('error', 'The session cookie data did not match what was expected. This could be a possible hacking attempt.');
|
||||
$this->sess_destroy();
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
// Unserialize the session array
|
||||
$session = $this->_unserialize($session);
|
||||
|
||||
// Is the session data we unserialized an array with the correct format?
|
||||
if ( ! is_array($session) OR ! isset($session['session_id']) OR ! isset($session['ip_address']) OR ! isset($session['user_agent']) OR ! isset($session['last_activity']))
|
||||
{
|
||||
$this->sess_destroy();
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// Is the session current?
|
||||
if (($session['last_activity'] + $this->sess_expiration) < $this->now)
|
||||
{
|
||||
$this->sess_destroy();
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// Does the IP Match?
|
||||
if ($this->sess_match_ip == TRUE AND $session['ip_address'] != $this->CI->input->ip_address())
|
||||
{
|
||||
$this->sess_destroy();
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// Does the User Agent Match?
|
||||
if ($this->sess_match_useragent == TRUE AND trim($session['user_agent']) != trim(substr($this->CI->input->user_agent(), 0, 50)))
|
||||
{
|
||||
$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']);
|
||||
}
|
||||
|
||||
$query = $this->CI->db->get($this->sess_table_name);
|
||||
|
||||
// No result? Kill it!
|
||||
if ($query->num_rows() == 0)
|
||||
{
|
||||
$this->sess_destroy();
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// Is there custom data? If so, add it to the main session array
|
||||
$row = $query->row();
|
||||
if (isset($row->user_data) AND $row->user_data != '')
|
||||
{
|
||||
$custom_data = $this->_unserialize($row->user_data);
|
||||
|
||||
if (is_array($custom_data))
|
||||
{
|
||||
foreach ($custom_data as $key => $val)
|
||||
{
|
||||
$session[$key] = $val;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Session is valid!
|
||||
$this->userdata = $session;
|
||||
unset($session);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Write the session data
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
function sess_write()
|
||||
{
|
||||
// Are we saving custom data to the DB? If not, all we do is update the cookie
|
||||
if ($this->sess_use_database === FALSE)
|
||||
{
|
||||
$this->_set_cookie();
|
||||
return;
|
||||
}
|
||||
|
||||
// set the custom userdata, the session data we will set in a second
|
||||
$custom_userdata = $this->userdata;
|
||||
$cookie_userdata = array();
|
||||
|
||||
// Before continuing, we need to determine if there is any custom data to deal with.
|
||||
// Let's determine this by removing the default indexes to see if there's anything left in the array
|
||||
// and set the session data while we're at it
|
||||
foreach (array('session_id','ip_address','user_agent','last_activity') as $val)
|
||||
{
|
||||
unset($custom_userdata[$val]);
|
||||
$cookie_userdata[$val] = $this->userdata[$val];
|
||||
}
|
||||
|
||||
// Did we find any custom data? If not, we turn the empty array into a string
|
||||
// since there's no reason to serialize and store an empty array in the DB
|
||||
if (count($custom_userdata) === 0)
|
||||
{
|
||||
$custom_userdata = '';
|
||||
}
|
||||
else
|
||||
{
|
||||
// Serialize the custom data array so we can store it
|
||||
$custom_userdata = $this->_serialize($custom_userdata);
|
||||
}
|
||||
|
||||
// Run the update query
|
||||
$this->CI->db->where('session_id', $this->userdata['session_id']);
|
||||
$this->CI->db->update($this->sess_table_name, array('last_activity' => $this->userdata['last_activity'], 'user_data' => $custom_userdata));
|
||||
|
||||
// Write the cookie. Notice that we manually pass the cookie data array to the
|
||||
// _set_cookie() function. Normally that function will store $this->userdata, but
|
||||
// in this case that array contains custom data, which we do not want in the cookie.
|
||||
$this->_set_cookie($cookie_userdata);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Create a new session
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
function sess_create()
|
||||
{
|
||||
$sessid = '';
|
||||
while (strlen($sessid) < 32)
|
||||
{
|
||||
$sessid .= mt_rand(0, mt_getrandmax());
|
||||
}
|
||||
|
||||
// To make the session ID even more secure we'll combine it with the user's IP
|
||||
$sessid .= $this->CI->input->ip_address();
|
||||
|
||||
$this->userdata = array(
|
||||
'session_id' => md5(uniqid($sessid, TRUE)),
|
||||
'ip_address' => $this->CI->input->ip_address(),
|
||||
'user_agent' => substr($this->CI->input->user_agent(), 0, 50),
|
||||
'last_activity' => $this->now
|
||||
);
|
||||
|
||||
|
||||
// Save the data to the DB if needed
|
||||
if ($this->sess_use_database === TRUE)
|
||||
{
|
||||
$this->CI->db->query($this->CI->db->insert_string($this->sess_table_name, $this->userdata));
|
||||
}
|
||||
|
||||
// Write the cookie
|
||||
$this->_set_cookie();
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Update an existing session
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
function sess_update()
|
||||
{
|
||||
// We only update the session every five minutes by default
|
||||
if (($this->userdata['last_activity'] + $this->sess_time_to_update) >= $this->now)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Save the old session id so we know which record to
|
||||
// update in the database if we need it
|
||||
$old_sessid = $this->userdata['session_id'];
|
||||
$new_sessid = '';
|
||||
while (strlen($new_sessid) < 32)
|
||||
{
|
||||
$new_sessid .= mt_rand(0, mt_getrandmax());
|
||||
}
|
||||
|
||||
// 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
|
||||
$new_sessid = md5(uniqid($new_sessid, TRUE));
|
||||
|
||||
// Update the session data in the session data array
|
||||
$this->userdata['session_id'] = $new_sessid;
|
||||
$this->userdata['last_activity'] = $this->now;
|
||||
|
||||
// _set_cookie() will handle this for us if we aren't using database sessions
|
||||
// by pushing all userdata to the cookie.
|
||||
$cookie_data = NULL;
|
||||
|
||||
// Update the session ID and last_activity field in the DB if needed
|
||||
if ($this->sess_use_database === TRUE)
|
||||
{
|
||||
// set cookie explicitly to only have our session data
|
||||
$cookie_data = array();
|
||||
foreach (array('session_id','ip_address','user_agent','last_activity') as $val)
|
||||
{
|
||||
$cookie_data[$val] = $this->userdata[$val];
|
||||
}
|
||||
|
||||
$this->CI->db->query($this->CI->db->update_string($this->sess_table_name, array('last_activity' => $this->now, 'session_id' => $new_sessid), array('session_id' => $old_sessid)));
|
||||
}
|
||||
|
||||
// Write the cookie
|
||||
$this->_set_cookie($cookie_data);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Destroy the current session
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
function sess_destroy()
|
||||
{
|
||||
// Kill the session DB row
|
||||
if ($this->sess_use_database === TRUE AND isset($this->userdata['session_id']))
|
||||
{
|
||||
$this->CI->db->where('session_id', $this->userdata['session_id']);
|
||||
$this->CI->db->delete($this->sess_table_name);
|
||||
}
|
||||
|
||||
// Kill the cookie
|
||||
setcookie(
|
||||
$this->sess_cookie_name,
|
||||
addslashes(serialize(array())),
|
||||
($this->now - 31500000),
|
||||
$this->cookie_path,
|
||||
$this->cookie_domain,
|
||||
0
|
||||
);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Fetch a specific item from the session array
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function userdata($item)
|
||||
{
|
||||
return ( ! isset($this->userdata[$item])) ? FALSE : $this->userdata[$item];
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Fetch all session data
|
||||
*
|
||||
* @access public
|
||||
* @return mixed
|
||||
*/
|
||||
function all_userdata()
|
||||
{
|
||||
return ( ! isset($this->userdata)) ? FALSE : $this->userdata;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Add or change data in the "userdata" array
|
||||
*
|
||||
* @access public
|
||||
* @param mixed
|
||||
* @param string
|
||||
* @return void
|
||||
*/
|
||||
function set_userdata($newdata = array(), $newval = '')
|
||||
{
|
||||
if (is_string($newdata))
|
||||
{
|
||||
$newdata = array($newdata => $newval);
|
||||
}
|
||||
|
||||
if (count($newdata) > 0)
|
||||
{
|
||||
foreach ($newdata as $key => $val)
|
||||
{
|
||||
$this->userdata[$key] = $val;
|
||||
}
|
||||
}
|
||||
|
||||
$this->sess_write();
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Delete a session variable from the "userdata" array
|
||||
*
|
||||
* @access array
|
||||
* @return void
|
||||
*/
|
||||
function unset_userdata($newdata = array())
|
||||
{
|
||||
if (is_string($newdata))
|
||||
{
|
||||
$newdata = array($newdata => '');
|
||||
}
|
||||
|
||||
if (count($newdata) > 0)
|
||||
{
|
||||
foreach ($newdata as $key => $val)
|
||||
{
|
||||
unset($this->userdata[$key]);
|
||||
}
|
||||
}
|
||||
|
||||
$this->sess_write();
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Add or change flashdata, only available
|
||||
* until the next request
|
||||
*
|
||||
* @access public
|
||||
* @param mixed
|
||||
* @param string
|
||||
* @return void
|
||||
*/
|
||||
function set_flashdata($newdata = array(), $newval = '')
|
||||
{
|
||||
if (is_string($newdata))
|
||||
{
|
||||
$newdata = array($newdata => $newval);
|
||||
}
|
||||
|
||||
if (count($newdata) > 0)
|
||||
{
|
||||
foreach ($newdata as $key => $val)
|
||||
{
|
||||
$flashdata_key = $this->flashdata_key.':new:'.$key;
|
||||
$this->set_userdata($flashdata_key, $val);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Keeps existing flashdata available to next request.
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @return void
|
||||
*/
|
||||
function keep_flashdata($key)
|
||||
{
|
||||
// 'old' flashdata gets removed. Here we mark all
|
||||
// flashdata as 'new' to preserve it from _flashdata_sweep()
|
||||
// Note the function will return FALSE if the $key
|
||||
// provided cannot be found
|
||||
$old_flashdata_key = $this->flashdata_key.':old:'.$key;
|
||||
$value = $this->userdata($old_flashdata_key);
|
||||
|
||||
$new_flashdata_key = $this->flashdata_key.':new:'.$key;
|
||||
$this->set_userdata($new_flashdata_key, $value);
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Fetch a specific flashdata item from the session array
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function flashdata($key)
|
||||
{
|
||||
$flashdata_key = $this->flashdata_key.':old:'.$key;
|
||||
return $this->userdata($flashdata_key);
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Identifies flashdata as 'old' for removal
|
||||
* when _flashdata_sweep() runs.
|
||||
*
|
||||
* @access private
|
||||
* @return void
|
||||
*/
|
||||
function _flashdata_mark()
|
||||
{
|
||||
$userdata = $this->all_userdata();
|
||||
foreach ($userdata as $name => $value)
|
||||
{
|
||||
$parts = explode(':new:', $name);
|
||||
if (is_array($parts) && count($parts) === 2)
|
||||
{
|
||||
$new_name = $this->flashdata_key.':old:'.$parts[1];
|
||||
$this->set_userdata($new_name, $value);
|
||||
$this->unset_userdata($name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Removes all flashdata marked as 'old'
|
||||
*
|
||||
* @access private
|
||||
* @return void
|
||||
*/
|
||||
|
||||
function _flashdata_sweep()
|
||||
{
|
||||
$userdata = $this->all_userdata();
|
||||
foreach ($userdata as $key => $value)
|
||||
{
|
||||
if (strpos($key, ':old:'))
|
||||
{
|
||||
$this->unset_userdata($key);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Get the "now" time
|
||||
*
|
||||
* @access private
|
||||
* @return string
|
||||
*/
|
||||
function _get_time()
|
||||
{
|
||||
if (strtolower($this->time_reference) == 'gmt')
|
||||
{
|
||||
$now = time();
|
||||
$time = mktime(gmdate("H", $now), gmdate("i", $now), gmdate("s", $now), gmdate("m", $now), gmdate("d", $now), gmdate("Y", $now));
|
||||
}
|
||||
else
|
||||
{
|
||||
$time = time();
|
||||
}
|
||||
|
||||
return $time;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Write the session cookie
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
function _set_cookie($cookie_data = NULL)
|
||||
{
|
||||
if (is_null($cookie_data))
|
||||
{
|
||||
$cookie_data = $this->userdata;
|
||||
}
|
||||
|
||||
// Serialize the userdata for the cookie
|
||||
$cookie_data = $this->_serialize($cookie_data);
|
||||
|
||||
if ($this->sess_encrypt_cookie == TRUE)
|
||||
{
|
||||
$cookie_data = $this->CI->encrypt->encode($cookie_data);
|
||||
}
|
||||
else
|
||||
{
|
||||
// if encryption is not used, we provide an md5 hash to prevent userside tampering
|
||||
$cookie_data = $cookie_data.md5($cookie_data.$this->encryption_key);
|
||||
}
|
||||
|
||||
// Set the cookie
|
||||
setcookie(
|
||||
$this->sess_cookie_name,
|
||||
$cookie_data,
|
||||
$this->sess_expiration + time(),
|
||||
$this->cookie_path,
|
||||
$this->cookie_domain,
|
||||
0
|
||||
);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Serialize an array
|
||||
*
|
||||
* This function first converts any slashes found in the array to a temporary
|
||||
* marker, so when it gets unserialized the slashes will be preserved
|
||||
*
|
||||
* @access private
|
||||
* @param array
|
||||
* @return string
|
||||
*/
|
||||
function _serialize($data)
|
||||
{
|
||||
if (is_array($data))
|
||||
{
|
||||
foreach ($data as $key => $val)
|
||||
{
|
||||
$data[$key] = str_replace('\\', '{{slash}}', $val);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$data = str_replace('\\', '{{slash}}', $data);
|
||||
}
|
||||
|
||||
return serialize($data);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Unserialize
|
||||
*
|
||||
* This function unserializes a data string, then converts any
|
||||
* temporary slash markers back to actual slashes
|
||||
*
|
||||
* @access private
|
||||
* @param array
|
||||
* @return string
|
||||
*/
|
||||
function _unserialize($data)
|
||||
{
|
||||
$data = @unserialize(strip_slashes($data));
|
||||
|
||||
if (is_array($data))
|
||||
{
|
||||
foreach ($data as $key => $val)
|
||||
{
|
||||
$data[$key] = str_replace('{{slash}}', '\\', $val);
|
||||
}
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
return str_replace('{{slash}}', '\\', $data);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Garbage collection
|
||||
*
|
||||
* This deletes expired session rows from database
|
||||
* if the probability percentage is met
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
function _sess_gc()
|
||||
{
|
||||
if ($this->sess_use_database != TRUE)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
srand(time());
|
||||
if ((rand() % 100) < $this->gc_probability)
|
||||
{
|
||||
$expire = $this->now - $this->sess_expiration;
|
||||
|
||||
$this->CI->db->where("last_activity < {$expire}");
|
||||
$this->CI->db->delete($this->sess_table_name);
|
||||
|
||||
log_message('debug', 'Session garbage collection performed.');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
// END Session Class
|
||||
|
||||
/* End of file Session.php */
|
||||
/* Location: ./system/libraries/Session.php */
|
||||
@@ -0,0 +1,251 @@
|
||||
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
/**
|
||||
* CodeIgniter
|
||||
*
|
||||
* An open source application development framework for PHP 4.3.2 or newer
|
||||
*
|
||||
* @package CodeIgniter
|
||||
* @author ExpressionEngine Dev Team
|
||||
* @copyright Copyright (c) 2008 - 2010, EllisLab, Inc.
|
||||
* @license http://codeigniter.com/user_guide/license.html
|
||||
* @link http://codeigniter.com
|
||||
* @since Version 1.0
|
||||
* @filesource
|
||||
*/
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* SHA1 Encoding Class
|
||||
*
|
||||
* Purpose: Provides 160 bit hashing using The Secure Hash Algorithm
|
||||
* developed at the National Institute of Standards and Technology. The 40
|
||||
* character SHA1 message hash is computationally infeasible to crack.
|
||||
*
|
||||
* This class is a fallback for servers that are not running PHP greater than
|
||||
* 4.3, or do not have the MHASH library.
|
||||
*
|
||||
* This class is based on two scripts:
|
||||
*
|
||||
* Marcus Campbell's PHP implementation (GNU license)
|
||||
* http://www.tecknik.net/sha-1/
|
||||
*
|
||||
* ...which is based on Paul Johnston's JavaScript version
|
||||
* (BSD license). http://pajhome.org.uk/
|
||||
*
|
||||
* I encapsulated the functions and wrote one additional method to fix
|
||||
* a hex conversion bug. - Rick Ellis
|
||||
*
|
||||
* @package CodeIgniter
|
||||
* @subpackage Libraries
|
||||
* @category Encryption
|
||||
* @author ExpressionEngine Dev Team
|
||||
* @link http://codeigniter.com/user_guide/general/encryption.html
|
||||
*/
|
||||
class CI_SHA {
|
||||
|
||||
function CI_SHA()
|
||||
{
|
||||
log_message('debug', "SHA1 Class Initialized");
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate the Hash
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function generate($str)
|
||||
{
|
||||
$n = ((strlen($str) + 8) >> 6) + 1;
|
||||
|
||||
for ($i = 0; $i < $n * 16; $i++)
|
||||
{
|
||||
$x[$i] = 0;
|
||||
}
|
||||
|
||||
for ($i = 0; $i < strlen($str); $i++)
|
||||
{
|
||||
$x[$i >> 2] |= ord(substr($str, $i, 1)) << (24 - ($i % 4) * 8);
|
||||
}
|
||||
|
||||
$x[$i >> 2] |= 0x80 << (24 - ($i % 4) * 8);
|
||||
|
||||
$x[$n * 16 - 1] = strlen($str) * 8;
|
||||
|
||||
$a = 1732584193;
|
||||
$b = -271733879;
|
||||
$c = -1732584194;
|
||||
$d = 271733878;
|
||||
$e = -1009589776;
|
||||
|
||||
for ($i = 0; $i < count($x); $i += 16)
|
||||
{
|
||||
$olda = $a;
|
||||
$oldb = $b;
|
||||
$oldc = $c;
|
||||
$oldd = $d;
|
||||
$olde = $e;
|
||||
|
||||
for($j = 0; $j < 80; $j++)
|
||||
{
|
||||
if ($j < 16)
|
||||
{
|
||||
$w[$j] = $x[$i + $j];
|
||||
}
|
||||
else
|
||||
{
|
||||
$w[$j] = $this->_rol($w[$j - 3] ^ $w[$j - 8] ^ $w[$j - 14] ^ $w[$j - 16], 1);
|
||||
}
|
||||
|
||||
$t = $this->_safe_add($this->_safe_add($this->_rol($a, 5), $this->_ft($j, $b, $c, $d)), $this->_safe_add($this->_safe_add($e, $w[$j]), $this->_kt($j)));
|
||||
|
||||
$e = $d;
|
||||
$d = $c;
|
||||
$c = $this->_rol($b, 30);
|
||||
$b = $a;
|
||||
$a = $t;
|
||||
}
|
||||
|
||||
$a = $this->_safe_add($a, $olda);
|
||||
$b = $this->_safe_add($b, $oldb);
|
||||
$c = $this->_safe_add($c, $oldc);
|
||||
$d = $this->_safe_add($d, $oldd);
|
||||
$e = $this->_safe_add($e, $olde);
|
||||
}
|
||||
|
||||
return $this->_hex($a).$this->_hex($b).$this->_hex($c).$this->_hex($d).$this->_hex($e);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Convert a decimal to hex
|
||||
*
|
||||
* @access private
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function _hex($str)
|
||||
{
|
||||
$str = dechex($str);
|
||||
|
||||
if (strlen($str) == 7)
|
||||
{
|
||||
$str = '0'.$str;
|
||||
}
|
||||
|
||||
return $str;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Return result based on iteration
|
||||
*
|
||||
* @access private
|
||||
* @return string
|
||||
*/
|
||||
function _ft($t, $b, $c, $d)
|
||||
{
|
||||
if ($t < 20)
|
||||
return ($b & $c) | ((~$b) & $d);
|
||||
if ($t < 40)
|
||||
return $b ^ $c ^ $d;
|
||||
if ($t < 60)
|
||||
return ($b & $c) | ($b & $d) | ($c & $d);
|
||||
|
||||
return $b ^ $c ^ $d;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Determine the additive constant
|
||||
*
|
||||
* @access private
|
||||
* @return string
|
||||
*/
|
||||
function _kt($t)
|
||||
{
|
||||
if ($t < 20)
|
||||
{
|
||||
return 1518500249;
|
||||
}
|
||||
else if ($t < 40)
|
||||
{
|
||||
return 1859775393;
|
||||
}
|
||||
else if ($t < 60)
|
||||
{
|
||||
return -1894007588;
|
||||
}
|
||||
else
|
||||
{
|
||||
return -899497514;
|
||||
}
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Add integers, wrapping at 2^32
|
||||
*
|
||||
* @access private
|
||||
* @return string
|
||||
*/
|
||||
function _safe_add($x, $y)
|
||||
{
|
||||
$lsw = ($x & 0xFFFF) + ($y & 0xFFFF);
|
||||
$msw = ($x >> 16) + ($y >> 16) + ($lsw >> 16);
|
||||
|
||||
return ($msw << 16) | ($lsw & 0xFFFF);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Bitwise rotate a 32-bit number
|
||||
*
|
||||
* @access private
|
||||
* @return integer
|
||||
*/
|
||||
function _rol($num, $cnt)
|
||||
{
|
||||
return ($num << $cnt) | $this->_zero_fill($num, 32 - $cnt);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Pad string with zero
|
||||
*
|
||||
* @access private
|
||||
* @return string
|
||||
*/
|
||||
function _zero_fill($a, $b)
|
||||
{
|
||||
$bin = decbin($a);
|
||||
|
||||
if (strlen($bin) < $b)
|
||||
{
|
||||
$bin = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
$bin = substr($bin, 0, strlen($bin) - $b);
|
||||
}
|
||||
|
||||
for ($i=0; $i < $b; $i++)
|
||||
{
|
||||
$bin = "0".$bin;
|
||||
}
|
||||
|
||||
return bindec($bin);
|
||||
}
|
||||
}
|
||||
// END CI_SHA
|
||||
|
||||
/* End of file Sha1.php */
|
||||
/* Location: ./system/libraries/Sha1.php */
|
||||
@@ -0,0 +1,440 @@
|
||||
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
/**
|
||||
* CodeIgniter
|
||||
*
|
||||
* An open source application development framework for PHP 4.3.2 or newer
|
||||
*
|
||||
* @package CodeIgniter
|
||||
* @author ExpressionEngine Dev Team
|
||||
* @copyright Copyright (c) 2008 - 2010, EllisLab, Inc.
|
||||
* @license http://codeigniter.com/user_guide/license.html
|
||||
* @link http://codeigniter.com
|
||||
* @since Version 1.3.1
|
||||
* @filesource
|
||||
*/
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* HTML Table Generating Class
|
||||
*
|
||||
* Lets you create tables manually or from database result objects, or arrays.
|
||||
*
|
||||
* @package CodeIgniter
|
||||
* @subpackage Libraries
|
||||
* @category HTML Tables
|
||||
* @author ExpressionEngine Dev Team
|
||||
* @link http://codeigniter.com/user_guide/libraries/uri.html
|
||||
*/
|
||||
class CI_Table {
|
||||
|
||||
var $rows = array();
|
||||
var $heading = array();
|
||||
var $auto_heading = TRUE;
|
||||
var $caption = NULL;
|
||||
var $template = NULL;
|
||||
var $newline = "\n";
|
||||
var $empty_cells = "";
|
||||
|
||||
|
||||
function CI_Table()
|
||||
{
|
||||
log_message('debug', "Table Class Initialized");
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Set the template
|
||||
*
|
||||
* @access public
|
||||
* @param array
|
||||
* @return void
|
||||
*/
|
||||
function set_template($template)
|
||||
{
|
||||
if ( ! is_array($template))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
$this->template = $template;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Set the table heading
|
||||
*
|
||||
* Can be passed as an array or discreet params
|
||||
*
|
||||
* @access public
|
||||
* @param mixed
|
||||
* @return void
|
||||
*/
|
||||
function set_heading()
|
||||
{
|
||||
$args = func_get_args();
|
||||
$this->heading = (is_array($args[0])) ? $args[0] : $args;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Set columns. Takes a one-dimensional array as input and creates
|
||||
* a multi-dimensional array with a depth equal to the number of
|
||||
* columns. This allows a single array with many elements to be
|
||||
* displayed in a table that has a fixed column count.
|
||||
*
|
||||
* @access public
|
||||
* @param array
|
||||
* @param int
|
||||
* @return void
|
||||
*/
|
||||
function make_columns($array = array(), $col_limit = 0)
|
||||
{
|
||||
if ( ! is_array($array) OR count($array) == 0)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// Turn off the auto-heading feature since it's doubtful we
|
||||
// will want headings from a one-dimensional array
|
||||
$this->auto_heading = FALSE;
|
||||
|
||||
if ($col_limit == 0)
|
||||
{
|
||||
return $array;
|
||||
}
|
||||
|
||||
$new = array();
|
||||
while(count($array) > 0)
|
||||
{
|
||||
$temp = array_splice($array, 0, $col_limit);
|
||||
|
||||
if (count($temp) < $col_limit)
|
||||
{
|
||||
for ($i = count($temp); $i < $col_limit; $i++)
|
||||
{
|
||||
$temp[] = ' ';
|
||||
}
|
||||
}
|
||||
|
||||
$new[] = $temp;
|
||||
}
|
||||
|
||||
return $new;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Set "empty" cells
|
||||
*
|
||||
* Can be passed as an array or discreet params
|
||||
*
|
||||
* @access public
|
||||
* @param mixed
|
||||
* @return void
|
||||
*/
|
||||
function set_empty($value)
|
||||
{
|
||||
$this->empty_cells = $value;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Add a table row
|
||||
*
|
||||
* Can be passed as an array or discreet params
|
||||
*
|
||||
* @access public
|
||||
* @param mixed
|
||||
* @return void
|
||||
*/
|
||||
function add_row()
|
||||
{
|
||||
$args = func_get_args();
|
||||
$this->rows[] = (is_array($args[0])) ? $args[0] : $args;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Add a table caption
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @return void
|
||||
*/
|
||||
function set_caption($caption)
|
||||
{
|
||||
$this->caption = $caption;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Generate the table
|
||||
*
|
||||
* @access public
|
||||
* @param mixed
|
||||
* @return string
|
||||
*/
|
||||
function generate($table_data = NULL)
|
||||
{
|
||||
// The table data can optionally be passed to this function
|
||||
// either as a database result object or an array
|
||||
if ( ! is_null($table_data))
|
||||
{
|
||||
if (is_object($table_data))
|
||||
{
|
||||
$this->_set_from_object($table_data);
|
||||
}
|
||||
elseif (is_array($table_data))
|
||||
{
|
||||
$set_heading = (count($this->heading) == 0 AND $this->auto_heading == FALSE) ? FALSE : TRUE;
|
||||
$this->_set_from_array($table_data, $set_heading);
|
||||
}
|
||||
}
|
||||
|
||||
// Is there anything to display? No? Smite them!
|
||||
if (count($this->heading) == 0 AND count($this->rows) == 0)
|
||||
{
|
||||
return 'Undefined table data';
|
||||
}
|
||||
|
||||
// Compile and validate the template date
|
||||
$this->_compile_template();
|
||||
|
||||
|
||||
// Build the table!
|
||||
|
||||
$out = $this->template['table_open'];
|
||||
$out .= $this->newline;
|
||||
|
||||
// Add any caption here
|
||||
if ($this->caption)
|
||||
{
|
||||
$out .= $this->newline;
|
||||
$out .= '<caption>' . $this->caption . '</caption>';
|
||||
$out .= $this->newline;
|
||||
}
|
||||
|
||||
// Is there a table heading to display?
|
||||
if (count($this->heading) > 0)
|
||||
{
|
||||
$out .= $this->template['heading_row_start'];
|
||||
$out .= $this->newline;
|
||||
|
||||
foreach($this->heading as $heading)
|
||||
{
|
||||
$out .= $this->template['heading_cell_start'];
|
||||
$out .= $heading;
|
||||
$out .= $this->template['heading_cell_end'];
|
||||
}
|
||||
|
||||
$out .= $this->template['heading_row_end'];
|
||||
$out .= $this->newline;
|
||||
}
|
||||
|
||||
// Build the table rows
|
||||
if (count($this->rows) > 0)
|
||||
{
|
||||
$i = 1;
|
||||
foreach($this->rows as $row)
|
||||
{
|
||||
if ( ! is_array($row))
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
// We use modulus to alternate the row colors
|
||||
$name = (fmod($i++, 2)) ? '' : 'alt_';
|
||||
|
||||
$out .= $this->template['row_'.$name.'start'];
|
||||
$out .= $this->newline;
|
||||
|
||||
foreach($row as $cell)
|
||||
{
|
||||
$out .= $this->template['cell_'.$name.'start'];
|
||||
|
||||
if ($cell === "")
|
||||
{
|
||||
$out .= $this->empty_cells;
|
||||
}
|
||||
else
|
||||
{
|
||||
$out .= $cell;
|
||||
}
|
||||
|
||||
$out .= $this->template['cell_'.$name.'end'];
|
||||
}
|
||||
|
||||
$out .= $this->template['row_'.$name.'end'];
|
||||
$out .= $this->newline;
|
||||
}
|
||||
}
|
||||
|
||||
$out .= $this->template['table_close'];
|
||||
|
||||
return $out;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Clears the table arrays. Useful if multiple tables are being generated
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
function clear()
|
||||
{
|
||||
$this->rows = array();
|
||||
$this->heading = array();
|
||||
$this->auto_heading = TRUE;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Set table data from a database result object
|
||||
*
|
||||
* @access public
|
||||
* @param object
|
||||
* @return void
|
||||
*/
|
||||
function _set_from_object($query)
|
||||
{
|
||||
if ( ! is_object($query))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// First generate the headings from the table column names
|
||||
if (count($this->heading) == 0)
|
||||
{
|
||||
if ( ! method_exists($query, 'list_fields'))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
$this->heading = $query->list_fields();
|
||||
}
|
||||
|
||||
// Next blast through the result array and build out the rows
|
||||
|
||||
if ($query->num_rows() > 0)
|
||||
{
|
||||
foreach ($query->result_array() as $row)
|
||||
{
|
||||
$this->rows[] = $row;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Set table data from an array
|
||||
*
|
||||
* @access public
|
||||
* @param array
|
||||
* @return void
|
||||
*/
|
||||
function _set_from_array($data, $set_heading = TRUE)
|
||||
{
|
||||
if ( ! is_array($data) OR count($data) == 0)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
$i = 0;
|
||||
foreach ($data as $row)
|
||||
{
|
||||
if ( ! is_array($row))
|
||||
{
|
||||
$this->rows[] = $data;
|
||||
break;
|
||||
}
|
||||
|
||||
// If a heading hasn't already been set we'll use the first row of the array as the heading
|
||||
if ($i == 0 AND count($data) > 1 AND count($this->heading) == 0 AND $set_heading == TRUE)
|
||||
{
|
||||
$this->heading = $row;
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->rows[] = $row;
|
||||
}
|
||||
|
||||
$i++;
|
||||
}
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Compile Template
|
||||
*
|
||||
* @access private
|
||||
* @return void
|
||||
*/
|
||||
function _compile_template()
|
||||
{
|
||||
if ($this->template == NULL)
|
||||
{
|
||||
$this->template = $this->_default_template();
|
||||
return;
|
||||
}
|
||||
|
||||
$this->temp = $this->_default_template();
|
||||
foreach (array('table_open','heading_row_start', 'heading_row_end', 'heading_cell_start', 'heading_cell_end', 'row_start', 'row_end', 'cell_start', 'cell_end', 'row_alt_start', 'row_alt_end', 'cell_alt_start', 'cell_alt_end', 'table_close') as $val)
|
||||
{
|
||||
if ( ! isset($this->template[$val]))
|
||||
{
|
||||
$this->template[$val] = $this->temp[$val];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Default Template
|
||||
*
|
||||
* @access private
|
||||
* @return void
|
||||
*/
|
||||
function _default_template()
|
||||
{
|
||||
return array (
|
||||
'table_open' => '<table border="0" cellpadding="4" cellspacing="0">',
|
||||
|
||||
'heading_row_start' => '<tr>',
|
||||
'heading_row_end' => '</tr>',
|
||||
'heading_cell_start' => '<th>',
|
||||
'heading_cell_end' => '</th>',
|
||||
|
||||
'row_start' => '<tr>',
|
||||
'row_end' => '</tr>',
|
||||
'cell_start' => '<td>',
|
||||
'cell_end' => '</td>',
|
||||
|
||||
'row_alt_start' => '<tr>',
|
||||
'row_alt_end' => '</tr>',
|
||||
'cell_alt_start' => '<td>',
|
||||
'cell_alt_end' => '</td>',
|
||||
|
||||
'table_close' => '</table>'
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* End of file Table.php */
|
||||
/* Location: ./system/libraries/Table.php */
|
||||
@@ -0,0 +1,547 @@
|
||||
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
/**
|
||||
* CodeIgniter
|
||||
*
|
||||
* An open source application development framework for PHP 4.3.2 or newer
|
||||
*
|
||||
* @package CodeIgniter
|
||||
* @author ExpressionEngine Dev Team
|
||||
* @copyright Copyright (c) 2008 - 2010, EllisLab, Inc.
|
||||
* @license http://codeigniter.com/user_guide/license.html
|
||||
* @link http://codeigniter.com
|
||||
* @since Version 1.0
|
||||
* @filesource
|
||||
*/
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Trackback Class
|
||||
*
|
||||
* Trackback Sending/Receiving Class
|
||||
*
|
||||
* @package CodeIgniter
|
||||
* @subpackage Libraries
|
||||
* @category Trackbacks
|
||||
* @author ExpressionEngine Dev Team
|
||||
* @link http://codeigniter.com/user_guide/libraries/trackback.html
|
||||
*/
|
||||
class CI_Trackback {
|
||||
|
||||
var $time_format = 'local';
|
||||
var $charset = 'UTF-8';
|
||||
var $data = array('url' => '', 'title' => '', 'excerpt' => '', 'blog_name' => '', 'charset' => '');
|
||||
var $convert_ascii = TRUE;
|
||||
var $response = '';
|
||||
var $error_msg = array();
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @access public
|
||||
*/
|
||||
function CI_Trackback()
|
||||
{
|
||||
log_message('debug', "Trackback Class Initialized");
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Send Trackback
|
||||
*
|
||||
* @access public
|
||||
* @param array
|
||||
* @return bool
|
||||
*/
|
||||
function send($tb_data)
|
||||
{
|
||||
if ( ! is_array($tb_data))
|
||||
{
|
||||
$this->set_error('The send() method must be passed an array');
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// Pre-process the Trackback Data
|
||||
foreach (array('url', 'title', 'excerpt', 'blog_name', 'ping_url') as $item)
|
||||
{
|
||||
if ( ! isset($tb_data[$item]))
|
||||
{
|
||||
$this->set_error('Required item missing: '.$item);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
switch ($item)
|
||||
{
|
||||
case 'ping_url' : $$item = $this->extract_urls($tb_data[$item]);
|
||||
break;
|
||||
case 'excerpt' : $$item = $this->limit_characters($this->convert_xml(strip_tags(stripslashes($tb_data[$item]))));
|
||||
break;
|
||||
case 'url' : $$item = str_replace('-', '-', $this->convert_xml(strip_tags(stripslashes($tb_data[$item]))));
|
||||
break;
|
||||
default : $$item = $this->convert_xml(strip_tags(stripslashes($tb_data[$item])));
|
||||
break;
|
||||
}
|
||||
|
||||
// Convert High ASCII Characters
|
||||
if ($this->convert_ascii == TRUE)
|
||||
{
|
||||
if ($item == 'excerpt')
|
||||
{
|
||||
$$item = $this->convert_ascii($$item);
|
||||
}
|
||||
elseif ($item == 'title')
|
||||
{
|
||||
$$item = $this->convert_ascii($$item);
|
||||
}
|
||||
elseif($item == 'blog_name')
|
||||
{
|
||||
$$item = $this->convert_ascii($$item);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Build the Trackback data string
|
||||
$charset = ( ! isset($tb_data['charset'])) ? $this->charset : $tb_data['charset'];
|
||||
|
||||
$data = "url=".rawurlencode($url)."&title=".rawurlencode($title)."&blog_name=".rawurlencode($blog_name)."&excerpt=".rawurlencode($excerpt)."&charset=".rawurlencode($charset);
|
||||
|
||||
// Send Trackback(s)
|
||||
$return = TRUE;
|
||||
if (count($ping_url) > 0)
|
||||
{
|
||||
foreach ($ping_url as $url)
|
||||
{
|
||||
if ($this->process($url, $data) == FALSE)
|
||||
{
|
||||
$return = FALSE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $return;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Receive Trackback Data
|
||||
*
|
||||
* This function simply validates the incoming TB data.
|
||||
* It returns false on failure and true on success.
|
||||
* If the data is valid it is set to the $this->data array
|
||||
* so that it can be inserted into a database.
|
||||
*
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
function receive()
|
||||
{
|
||||
foreach (array('url', 'title', 'blog_name', 'excerpt') as $val)
|
||||
{
|
||||
if ( ! isset($_POST[$val]) OR $_POST[$val] == '')
|
||||
{
|
||||
$this->set_error('The following required POST variable is missing: '.$val);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
$this->data['charset'] = ( ! isset($_POST['charset'])) ? 'auto' : strtoupper(trim($_POST['charset']));
|
||||
|
||||
if ($val != 'url' && function_exists('mb_convert_encoding'))
|
||||
{
|
||||
$_POST[$val] = mb_convert_encoding($_POST[$val], $this->charset, $this->data['charset']);
|
||||
}
|
||||
|
||||
$_POST[$val] = ($val != 'url') ? $this->convert_xml(strip_tags($_POST[$val])) : strip_tags($_POST[$val]);
|
||||
|
||||
if ($val == 'excerpt')
|
||||
{
|
||||
$_POST['excerpt'] = $this->limit_characters($_POST['excerpt']);
|
||||
}
|
||||
|
||||
$this->data[$val] = $_POST[$val];
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Send Trackback Error Message
|
||||
*
|
||||
* Allows custom errors to be set. By default it
|
||||
* sends the "incomplete information" error, as that's
|
||||
* the most common one.
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @return void
|
||||
*/
|
||||
function send_error($message = 'Incomplete Information')
|
||||
{
|
||||
echo "<?xml version=\"1.0\" encoding=\"utf-8\"?".">\n<response>\n<error>1</error>\n<message>".$message."</message>\n</response>";
|
||||
exit;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Send Trackback Success Message
|
||||
*
|
||||
* This should be called when a trackback has been
|
||||
* successfully received and inserted.
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
function send_success()
|
||||
{
|
||||
echo "<?xml version=\"1.0\" encoding=\"utf-8\"?".">\n<response>\n<error>0</error>\n</response>";
|
||||
exit;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Fetch a particular item
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function data($item)
|
||||
{
|
||||
return ( ! isset($this->data[$item])) ? '' : $this->data[$item];
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Process Trackback
|
||||
*
|
||||
* Opens a socket connection and passes the data to
|
||||
* the server. Returns true on success, false on failure
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @param string
|
||||
* @return bool
|
||||
*/
|
||||
function process($url, $data)
|
||||
{
|
||||
$target = parse_url($url);
|
||||
|
||||
// Open the socket
|
||||
if ( ! $fp = @fsockopen($target['host'], 80))
|
||||
{
|
||||
$this->set_error('Invalid Connection: '.$url);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// Build the path
|
||||
$ppath = ( ! isset($target['path'])) ? $url : $target['path'];
|
||||
|
||||
$path = (isset($target['query']) && $target['query'] != "") ? $ppath.'?'.$target['query'] : $ppath;
|
||||
|
||||
// Add the Trackback ID to the data string
|
||||
if ($id = $this->get_id($url))
|
||||
{
|
||||
$data = "tb_id=".$id."&".$data;
|
||||
}
|
||||
|
||||
// Transfer the data
|
||||
fputs ($fp, "POST " . $path . " HTTP/1.0\r\n" );
|
||||
fputs ($fp, "Host: " . $target['host'] . "\r\n" );
|
||||
fputs ($fp, "Content-type: application/x-www-form-urlencoded\r\n" );
|
||||
fputs ($fp, "Content-length: " . strlen($data) . "\r\n" );
|
||||
fputs ($fp, "Connection: close\r\n\r\n" );
|
||||
fputs ($fp, $data);
|
||||
|
||||
// Was it successful?
|
||||
$this->response = "";
|
||||
|
||||
while( ! feof($fp))
|
||||
{
|
||||
$this->response .= fgets($fp, 128);
|
||||
}
|
||||
@fclose($fp);
|
||||
|
||||
if (stristr($this->response, '<error>0</error>') === FALSE)
|
||||
{
|
||||
$message = 'An unknown error was encountered';
|
||||
|
||||
if (preg_match("/<message>(.*?)<\/message>/is", $this->response, $match))
|
||||
{
|
||||
$message = trim($match['1']);
|
||||
}
|
||||
|
||||
$this->set_error($message);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Extract Trackback URLs
|
||||
*
|
||||
* This function lets multiple trackbacks be sent.
|
||||
* It takes a string of URLs (separated by comma or
|
||||
* space) and puts each URL into an array
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function extract_urls($urls)
|
||||
{
|
||||
// Remove the pesky white space and replace with a comma.
|
||||
$urls = preg_replace("/\s*(\S+)\s*/", "\\1,", $urls);
|
||||
|
||||
// If they use commas get rid of the doubles.
|
||||
$urls = str_replace(",,", ",", $urls);
|
||||
|
||||
// Remove any comma that might be at the end
|
||||
if (substr($urls, -1) == ",")
|
||||
{
|
||||
$urls = substr($urls, 0, -1);
|
||||
}
|
||||
|
||||
// Break into an array via commas
|
||||
$urls = preg_split('/[,]/', $urls);
|
||||
|
||||
// Removes duplicates
|
||||
$urls = array_unique($urls);
|
||||
|
||||
array_walk($urls, array($this, 'validate_url'));
|
||||
|
||||
return $urls;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Validate URL
|
||||
*
|
||||
* Simply adds "http://" if missing
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function validate_url($url)
|
||||
{
|
||||
$url = trim($url);
|
||||
|
||||
if (substr($url, 0, 4) != "http")
|
||||
{
|
||||
$url = "http://".$url;
|
||||
}
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Find the Trackback URL's ID
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function get_id($url)
|
||||
{
|
||||
$tb_id = "";
|
||||
|
||||
if (strstr($url, '?'))
|
||||
{
|
||||
$tb_array = explode('/', $url);
|
||||
$tb_end = $tb_array[count($tb_array)-1];
|
||||
|
||||
if ( ! is_numeric($tb_end))
|
||||
{
|
||||
$tb_end = $tb_array[count($tb_array)-2];
|
||||
}
|
||||
|
||||
$tb_array = explode('=', $tb_end);
|
||||
$tb_id = $tb_array[count($tb_array)-1];
|
||||
}
|
||||
else
|
||||
{
|
||||
$url = rtrim($url, '/');
|
||||
|
||||
$tb_array = explode('/', $url);
|
||||
$tb_id = $tb_array[count($tb_array)-1];
|
||||
|
||||
if ( ! is_numeric($tb_id))
|
||||
{
|
||||
$tb_id = $tb_array[count($tb_array)-2];
|
||||
}
|
||||
}
|
||||
|
||||
if ( ! preg_match ("/^([0-9]+)$/", $tb_id))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
return $tb_id;
|
||||
}
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Convert Reserved XML characters to Entities
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function convert_xml($str)
|
||||
{
|
||||
$temp = '__TEMP_AMPERSANDS__';
|
||||
|
||||
$str = preg_replace("/&#(\d+);/", "$temp\\1;", $str);
|
||||
$str = preg_replace("/&(\w+);/", "$temp\\1;", $str);
|
||||
|
||||
$str = str_replace(array("&","<",">","\"", "'", "-"),
|
||||
array("&", "<", ">", """, "'", "-"),
|
||||
$str);
|
||||
|
||||
$str = preg_replace("/$temp(\d+);/","&#\\1;",$str);
|
||||
$str = preg_replace("/$temp(\w+);/","&\\1;", $str);
|
||||
|
||||
return $str;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Character limiter
|
||||
*
|
||||
* Limits the string based on the character count. Will preserve complete words.
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @param integer
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function limit_characters($str, $n = 500, $end_char = '…')
|
||||
{
|
||||
if (strlen($str) < $n)
|
||||
{
|
||||
return $str;
|
||||
}
|
||||
|
||||
$str = preg_replace("/\s+/", ' ', str_replace(array("\r\n", "\r", "\n"), ' ', $str));
|
||||
|
||||
if (strlen($str) <= $n)
|
||||
{
|
||||
return $str;
|
||||
}
|
||||
|
||||
$out = "";
|
||||
foreach (explode(' ', trim($str)) as $val)
|
||||
{
|
||||
$out .= $val.' ';
|
||||
if (strlen($out) >= $n)
|
||||
{
|
||||
return trim($out).$end_char;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* High ASCII to Entities
|
||||
*
|
||||
* Converts Hight ascii text and MS Word special chars
|
||||
* to character entities
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function convert_ascii($str)
|
||||
{
|
||||
$count = 1;
|
||||
$out = '';
|
||||
$temp = array();
|
||||
|
||||
for ($i = 0, $s = strlen($str); $i < $s; $i++)
|
||||
{
|
||||
$ordinal = ord($str[$i]);
|
||||
|
||||
if ($ordinal < 128)
|
||||
{
|
||||
$out .= $str[$i];
|
||||
}
|
||||
else
|
||||
{
|
||||
if (count($temp) == 0)
|
||||
{
|
||||
$count = ($ordinal < 224) ? 2 : 3;
|
||||
}
|
||||
|
||||
$temp[] = $ordinal;
|
||||
|
||||
if (count($temp) == $count)
|
||||
{
|
||||
$number = ($count == 3) ? (($temp['0'] % 16) * 4096) + (($temp['1'] % 64) * 64) + ($temp['2'] % 64) : (($temp['0'] % 32) * 64) + ($temp['1'] % 64);
|
||||
|
||||
$out .= '&#'.$number.';';
|
||||
$count = 1;
|
||||
$temp = array();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $out;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Set error message
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @return void
|
||||
*/
|
||||
function set_error($msg)
|
||||
{
|
||||
log_message('error', $msg);
|
||||
$this->error_msg[] = $msg;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Show error messages
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function display_errors($open = '<p>', $close = '</p>')
|
||||
{
|
||||
$str = '';
|
||||
foreach ($this->error_msg as $val)
|
||||
{
|
||||
$str .= $open.$val.$close;
|
||||
}
|
||||
|
||||
return $str;
|
||||
}
|
||||
|
||||
}
|
||||
// END Trackback Class
|
||||
|
||||
/* End of file Trackback.php */
|
||||
/* Location: ./system/libraries/Trackback.php */
|
||||
@@ -0,0 +1,406 @@
|
||||
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
/**
|
||||
* CodeIgniter
|
||||
*
|
||||
* An open source application development framework for PHP 4.3.2 or newer
|
||||
*
|
||||
* @package CodeIgniter
|
||||
* @author ExpressionEngine Dev Team
|
||||
* @copyright Copyright (c) 2008 - 2010, EllisLab, Inc.
|
||||
* @license http://codeigniter.com/user_guide/license.html
|
||||
* @link http://codeigniter.com
|
||||
* @since Version 1.0
|
||||
* @filesource
|
||||
*/
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Typography Class
|
||||
*
|
||||
*
|
||||
* @access private
|
||||
* @category Helpers
|
||||
* @author ExpressionEngine Dev Team
|
||||
* @link http://codeigniter.com/user_guide/helpers/
|
||||
*/
|
||||
class CI_Typography {
|
||||
|
||||
// Block level elements that should not be wrapped inside <p> tags
|
||||
var $block_elements = 'address|blockquote|div|dl|fieldset|form|h\d|hr|noscript|object|ol|p|pre|script|table|ul';
|
||||
|
||||
// Elements that should not have <p> and <br /> tags within them.
|
||||
var $skip_elements = 'p|pre|ol|ul|dl|object|table|h\d';
|
||||
|
||||
// Tags we want the parser to completely ignore when splitting the string.
|
||||
var $inline_elements = 'a|abbr|acronym|b|bdo|big|br|button|cite|code|del|dfn|em|i|img|ins|input|label|map|kbd|q|samp|select|small|span|strong|sub|sup|textarea|tt|var';
|
||||
|
||||
// array of block level elements that require inner content to be within another block level element
|
||||
var $inner_block_required = array('blockquote');
|
||||
|
||||
// the last block element parsed
|
||||
var $last_block_element = '';
|
||||
|
||||
// whether or not to protect quotes within { curly braces }
|
||||
var $protect_braced_quotes = FALSE;
|
||||
|
||||
/**
|
||||
* Nothing to do here...
|
||||
*
|
||||
*/
|
||||
function CI_Typography()
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Auto Typography
|
||||
*
|
||||
* This function converts text, making it typographically correct:
|
||||
* - Converts double spaces into paragraphs.
|
||||
* - Converts single line breaks into <br /> tags
|
||||
* - Converts single and double quotes into correctly facing curly quote entities.
|
||||
* - Converts three dots into ellipsis.
|
||||
* - Converts double dashes into em-dashes.
|
||||
* - Converts two spaces into entities
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @param bool whether to reduce more then two consecutive newlines to two
|
||||
* @return string
|
||||
*/
|
||||
function auto_typography($str, $reduce_linebreaks = FALSE)
|
||||
{
|
||||
if ($str == '')
|
||||
{
|
||||
return '';
|
||||
}
|
||||
|
||||
// Standardize Newlines to make matching easier
|
||||
if (strpos($str, "\r") !== FALSE)
|
||||
{
|
||||
$str = str_replace(array("\r\n", "\r"), "\n", $str);
|
||||
}
|
||||
|
||||
// Reduce line breaks. If there are more than two consecutive linebreaks
|
||||
// we'll compress them down to a maximum of two since there's no benefit to more.
|
||||
if ($reduce_linebreaks === TRUE)
|
||||
{
|
||||
$str = preg_replace("/\n\n+/", "\n\n", $str);
|
||||
}
|
||||
|
||||
// HTML comment tags don't conform to patterns of normal tags, so pull them out separately, only if needed
|
||||
$html_comments = array();
|
||||
if (strpos($str, '<!--') !== FALSE)
|
||||
{
|
||||
if (preg_match_all("#(<!\-\-.*?\-\->)#s", $str, $matches))
|
||||
{
|
||||
for ($i = 0, $total = count($matches[0]); $i < $total; $i++)
|
||||
{
|
||||
$html_comments[] = $matches[0][$i];
|
||||
$str = str_replace($matches[0][$i], '{@HC'.$i.'}', $str);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// match and yank <pre> tags if they exist. It's cheaper to do this separately since most content will
|
||||
// not contain <pre> tags, and it keeps the PCRE patterns below simpler and faster
|
||||
if (strpos($str, '<pre') !== FALSE)
|
||||
{
|
||||
$str = preg_replace_callback("#<pre.*?>.*?</pre>#si", array($this, '_protect_characters'), $str);
|
||||
}
|
||||
|
||||
// Convert quotes within tags to temporary markers.
|
||||
$str = preg_replace_callback("#<.+?>#si", array($this, '_protect_characters'), $str);
|
||||
|
||||
// Do the same with braces if necessary
|
||||
if ($this->protect_braced_quotes === TRUE)
|
||||
{
|
||||
$str = preg_replace_callback("#\{.+?\}#si", array($this, '_protect_characters'), $str);
|
||||
}
|
||||
|
||||
// Convert "ignore" tags to temporary marker. The parser splits out the string at every tag
|
||||
// it encounters. Certain inline tags, like image tags, links, span tags, etc. will be
|
||||
// adversely affected if they are split out so we'll convert the opening bracket < temporarily to: {@TAG}
|
||||
$str = preg_replace("#<(/*)(".$this->inline_elements.")([ >])#i", "{@TAG}\\1\\2\\3", $str);
|
||||
|
||||
// Split the string at every tag. This expression creates an array with this prototype:
|
||||
//
|
||||
// [array]
|
||||
// {
|
||||
// [0] = <opening tag>
|
||||
// [1] = Content...
|
||||
// [2] = <closing tag>
|
||||
// Etc...
|
||||
// }
|
||||
$chunks = preg_split('/(<(?:[^<>]+(?:"[^"]*"|\'[^\']*\')?)+>)/', $str, -1, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY);
|
||||
|
||||
// Build our finalized string. We cycle through the array, skipping tags, and processing the contained text
|
||||
$str = '';
|
||||
$process = TRUE;
|
||||
$paragraph = FALSE;
|
||||
$current_chunk = 0;
|
||||
$total_chunks = count($chunks);
|
||||
|
||||
foreach ($chunks as $chunk)
|
||||
{
|
||||
$current_chunk++;
|
||||
|
||||
// Are we dealing with a tag? If so, we'll skip the processing for this cycle.
|
||||
// Well also set the "process" flag which allows us to skip <pre> tags and a few other things.
|
||||
if (preg_match("#<(/*)(".$this->block_elements.").*?>#", $chunk, $match))
|
||||
{
|
||||
if (preg_match("#".$this->skip_elements."#", $match[2]))
|
||||
{
|
||||
$process = ($match[1] == '/') ? TRUE : FALSE;
|
||||
}
|
||||
|
||||
if ($match[1] == '')
|
||||
{
|
||||
$this->last_block_element = $match[2];
|
||||
}
|
||||
|
||||
$str .= $chunk;
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($process == FALSE)
|
||||
{
|
||||
$str .= $chunk;
|
||||
continue;
|
||||
}
|
||||
|
||||
// Force a newline to make sure end tags get processed by _format_newlines()
|
||||
if ($current_chunk == $total_chunks)
|
||||
{
|
||||
$chunk .= "\n";
|
||||
}
|
||||
|
||||
// Convert Newlines into <p> and <br /> tags
|
||||
$str .= $this->_format_newlines($chunk);
|
||||
}
|
||||
|
||||
// No opening block level tag? Add it if needed.
|
||||
if ( ! preg_match("/^\s*<(?:".$this->block_elements.")/i", $str))
|
||||
{
|
||||
$str = preg_replace("/^(.*?)<(".$this->block_elements.")/i", '<p>$1</p><$2', $str);
|
||||
}
|
||||
|
||||
// Convert quotes, elipsis, em-dashes, non-breaking spaces, and ampersands
|
||||
$str = $this->format_characters($str);
|
||||
|
||||
// restore HTML comments
|
||||
for ($i = 0, $total = count($html_comments); $i < $total; $i++)
|
||||
{
|
||||
// remove surrounding paragraph tags, but only if there's an opening paragraph tag
|
||||
// otherwise HTML comments at the ends of paragraphs will have the closing tag removed
|
||||
// if '<p>{@HC1}' then replace <p>{@HC1}</p> with the comment, else replace only {@HC1} with the comment
|
||||
$str = preg_replace('#(?(?=<p>\{@HC'.$i.'\})<p>\{@HC'.$i.'\}(\s*</p>)|\{@HC'.$i.'\})#s', $html_comments[$i], $str);
|
||||
}
|
||||
|
||||
// Final clean up
|
||||
$table = array(
|
||||
|
||||
// If the user submitted their own paragraph tags within the text
|
||||
// we will retain them instead of using our tags.
|
||||
'/(<p[^>*?]>)<p>/' => '$1', // <?php BBEdit syntax coloring bug fix
|
||||
|
||||
// Reduce multiple instances of opening/closing paragraph tags to a single one
|
||||
'#(</p>)+#' => '</p>',
|
||||
'/(<p>\W*<p>)+/' => '<p>',
|
||||
|
||||
// Clean up stray paragraph tags that appear before block level elements
|
||||
'#<p></p><('.$this->block_elements.')#' => '<$1',
|
||||
|
||||
// Clean up stray non-breaking spaces preceeding block elements
|
||||
'#( \s*)+<('.$this->block_elements.')#' => ' <$2',
|
||||
|
||||
// Replace the temporary markers we added earlier
|
||||
'/\{@TAG\}/' => '<',
|
||||
'/\{@DQ\}/' => '"',
|
||||
'/\{@SQ\}/' => "'",
|
||||
'/\{@DD\}/' => '--',
|
||||
'/\{@NBS\}/' => ' '
|
||||
|
||||
);
|
||||
|
||||
// Do we need to reduce empty lines?
|
||||
if ($reduce_linebreaks === TRUE)
|
||||
{
|
||||
$table['#<p>\n*</p>#'] = '';
|
||||
}
|
||||
else
|
||||
{
|
||||
// If we have empty paragraph tags we add a non-breaking space
|
||||
// otherwise most browsers won't treat them as true paragraphs
|
||||
$table['#<p></p>#'] = '<p> </p>';
|
||||
}
|
||||
|
||||
return preg_replace(array_keys($table), $table, $str);
|
||||
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Format Characters
|
||||
*
|
||||
* This function mainly converts double and single quotes
|
||||
* to curly entities, but it also converts em-dashes,
|
||||
* double spaces, and ampersands
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function format_characters($str)
|
||||
{
|
||||
static $table;
|
||||
|
||||
if ( ! isset($table))
|
||||
{
|
||||
$table = array(
|
||||
// nested smart quotes, opening and closing
|
||||
// note that rules for grammar (English) allow only for two levels deep
|
||||
// and that single quotes are _supposed_ to always be on the outside
|
||||
// but we'll accommodate both
|
||||
// Note that in all cases, whitespace is the primary determining factor
|
||||
// on which direction to curl, with non-word characters like punctuation
|
||||
// being a secondary factor only after whitespace is addressed.
|
||||
'/\'"(\s|$)/' => '’”$1',
|
||||
'/(^|\s|<p>)\'"/' => '$1‘“',
|
||||
'/\'"(\W)/' => '’”$1',
|
||||
'/(\W)\'"/' => '$1‘“',
|
||||
'/"\'(\s|$)/' => '”’$1',
|
||||
'/(^|\s|<p>)"\'/' => '$1“‘',
|
||||
'/"\'(\W)/' => '”’$1',
|
||||
'/(\W)"\'/' => '$1“‘',
|
||||
|
||||
// single quote smart quotes
|
||||
'/\'(\s|$)/' => '’$1',
|
||||
'/(^|\s|<p>)\'/' => '$1‘',
|
||||
'/\'(\W)/' => '’$1',
|
||||
'/(\W)\'/' => '$1‘',
|
||||
|
||||
// double quote smart quotes
|
||||
'/"(\s|$)/' => '”$1',
|
||||
'/(^|\s|<p>)"/' => '$1“',
|
||||
'/"(\W)/' => '”$1',
|
||||
'/(\W)"/' => '$1“',
|
||||
|
||||
// apostrophes
|
||||
"/(\w)'(\w)/" => '$1’$2',
|
||||
|
||||
// Em dash and ellipses dots
|
||||
'/\s?\-\-\s?/' => '—',
|
||||
'/(\w)\.{3}/' => '$1…',
|
||||
|
||||
// double space after sentences
|
||||
'/(\W) /' => '$1 ',
|
||||
|
||||
// ampersands, if not a character entity
|
||||
'/&(?!#?[a-zA-Z0-9]{2,};)/' => '&'
|
||||
);
|
||||
}
|
||||
|
||||
return preg_replace(array_keys($table), $table, $str);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Format Newlines
|
||||
*
|
||||
* Converts newline characters into either <p> tags or <br />
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function _format_newlines($str)
|
||||
{
|
||||
if ($str == '')
|
||||
{
|
||||
return $str;
|
||||
}
|
||||
|
||||
if (strpos($str, "\n") === FALSE && ! in_array($this->last_block_element, $this->inner_block_required))
|
||||
{
|
||||
return $str;
|
||||
}
|
||||
|
||||
// Convert two consecutive newlines to paragraphs
|
||||
$str = str_replace("\n\n", "</p>\n\n<p>", $str);
|
||||
|
||||
// Convert single spaces to <br /> tags
|
||||
$str = preg_replace("/([^\n])(\n)([^\n])/", "\\1<br />\\2\\3", $str);
|
||||
|
||||
// Wrap the whole enchilada in enclosing paragraphs
|
||||
if ($str != "\n")
|
||||
{
|
||||
$str = '<p>'.$str.'</p>';
|
||||
}
|
||||
|
||||
// Remove empty paragraphs if they are on the first line, as this
|
||||
// is a potential unintended consequence of the previous code
|
||||
$str = preg_replace("/<p><\/p>(.*)/", "\\1", $str, 1);
|
||||
|
||||
return $str;
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Protect Characters
|
||||
*
|
||||
* Protects special characters from being formatted later
|
||||
* We don't want quotes converted within tags so we'll temporarily convert them to {@DQ} and {@SQ}
|
||||
* and we don't want double dashes converted to emdash entities, so they are marked with {@DD}
|
||||
* likewise double spaces are converted to {@NBS} to prevent entity conversion
|
||||
*
|
||||
* @access public
|
||||
* @param array
|
||||
* @return string
|
||||
*/
|
||||
function _protect_characters($match)
|
||||
{
|
||||
return str_replace(array("'",'"','--',' '), array('{@SQ}', '{@DQ}', '{@DD}', '{@NBS}'), $match[0]);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Convert newlines to HTML line breaks except within PRE tags
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function nl2br_except_pre($str)
|
||||
{
|
||||
$ex = explode("pre>",$str);
|
||||
$ct = count($ex);
|
||||
|
||||
$newstr = "";
|
||||
for ($i = 0; $i < $ct; $i++)
|
||||
{
|
||||
if (($i % 2) == 0)
|
||||
{
|
||||
$newstr .= nl2br($ex[$i]);
|
||||
}
|
||||
else
|
||||
{
|
||||
$newstr .= $ex[$i];
|
||||
}
|
||||
|
||||
if ($ct - 1 != $i)
|
||||
$newstr .= "pre>";
|
||||
}
|
||||
|
||||
return $newstr;
|
||||
}
|
||||
|
||||
}
|
||||
// END Typography Class
|
||||
|
||||
/* End of file Typography.php */
|
||||
/* Location: ./system/libraries/Typography.php */
|
||||
@@ -0,0 +1,586 @@
|
||||
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
/**
|
||||
* CodeIgniter
|
||||
*
|
||||
* An open source application development framework for PHP 4.3.2 or newer
|
||||
*
|
||||
* @package CodeIgniter
|
||||
* @author ExpressionEngine Dev Team
|
||||
* @copyright Copyright (c) 2008 - 2010, EllisLab, Inc.
|
||||
* @license http://codeigniter.com/user_guide/license.html
|
||||
* @link http://codeigniter.com
|
||||
* @since Version 1.0
|
||||
* @filesource
|
||||
*/
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* URI Class
|
||||
*
|
||||
* Parses URIs and determines routing
|
||||
*
|
||||
* @package CodeIgniter
|
||||
* @subpackage Libraries
|
||||
* @category URI
|
||||
* @author ExpressionEngine Dev Team
|
||||
* @link http://codeigniter.com/user_guide/libraries/uri.html
|
||||
*/
|
||||
class CI_URI {
|
||||
|
||||
var $keyval = array();
|
||||
var $uri_string;
|
||||
var $segments = array();
|
||||
var $rsegments = array();
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* Simply globalizes the $RTR object. The front
|
||||
* loads the Router class early on so it's not available
|
||||
* normally as other classes are.
|
||||
*
|
||||
* @access public
|
||||
*/
|
||||
function CI_URI()
|
||||
{
|
||||
$this->config =& load_class('Config');
|
||||
log_message('debug', "URI Class Initialized");
|
||||
}
|
||||
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Get the URI String
|
||||
*
|
||||
* @access private
|
||||
* @return string
|
||||
*/
|
||||
function _fetch_uri_string()
|
||||
{
|
||||
if (strtoupper($this->config->item('uri_protocol')) == 'AUTO')
|
||||
{
|
||||
// If the URL has a question mark then it's simplest to just
|
||||
// build the URI string from the zero index of the $_GET array.
|
||||
// This avoids having to deal with $_SERVER variables, which
|
||||
// can be unreliable in some environments
|
||||
if (is_array($_GET) && count($_GET) == 1 && trim(key($_GET), '/') != '')
|
||||
{
|
||||
$this->uri_string = key($_GET);
|
||||
return;
|
||||
}
|
||||
|
||||
// Is there a PATH_INFO variable?
|
||||
// Note: some servers seem to have trouble with getenv() so we'll test it two ways
|
||||
$path = (isset($_SERVER['PATH_INFO'])) ? $_SERVER['PATH_INFO'] : @getenv('PATH_INFO');
|
||||
if (trim($path, '/') != '' && $path != "/".SELF)
|
||||
{
|
||||
$this->uri_string = $path;
|
||||
return;
|
||||
}
|
||||
|
||||
// No PATH_INFO?... What about QUERY_STRING?
|
||||
$path = (isset($_SERVER['QUERY_STRING'])) ? $_SERVER['QUERY_STRING'] : @getenv('QUERY_STRING');
|
||||
if (trim($path, '/') != '')
|
||||
{
|
||||
$this->uri_string = $path;
|
||||
return;
|
||||
}
|
||||
|
||||
// No QUERY_STRING?... Maybe the ORIG_PATH_INFO variable exists?
|
||||
$path = str_replace($_SERVER['SCRIPT_NAME'], '', (isset($_SERVER['ORIG_PATH_INFO'])) ? $_SERVER['ORIG_PATH_INFO'] : @getenv('ORIG_PATH_INFO'));
|
||||
if (trim($path, '/') != '' && $path != "/".SELF)
|
||||
{
|
||||
// remove path and script information so we have good URI data
|
||||
$this->uri_string = $path;
|
||||
return;
|
||||
}
|
||||
|
||||
// We've exhausted all our options...
|
||||
$this->uri_string = '';
|
||||
}
|
||||
else
|
||||
{
|
||||
$uri = strtoupper($this->config->item('uri_protocol'));
|
||||
|
||||
if ($uri == 'REQUEST_URI')
|
||||
{
|
||||
$this->uri_string = $this->_parse_request_uri();
|
||||
return;
|
||||
}
|
||||
|
||||
$this->uri_string = (isset($_SERVER[$uri])) ? $_SERVER[$uri] : @getenv($uri);
|
||||
}
|
||||
|
||||
// If the URI contains only a slash we'll kill it
|
||||
if ($this->uri_string == '/')
|
||||
{
|
||||
$this->uri_string = '';
|
||||
}
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Parse the REQUEST_URI
|
||||
*
|
||||
* Due to the way REQUEST_URI works it usually contains path info
|
||||
* that makes it unusable as URI data. We'll trim off the unnecessary
|
||||
* data, hopefully arriving at a valid URI that we can use.
|
||||
*
|
||||
* @access private
|
||||
* @return string
|
||||
*/
|
||||
function _parse_request_uri()
|
||||
{
|
||||
if ( ! isset($_SERVER['REQUEST_URI']) OR $_SERVER['REQUEST_URI'] == '')
|
||||
{
|
||||
return '';
|
||||
}
|
||||
|
||||
$request_uri = preg_replace("|/(.*)|", "\\1", str_replace("\\", "/", $_SERVER['REQUEST_URI']));
|
||||
|
||||
if ($request_uri == '' OR $request_uri == SELF)
|
||||
{
|
||||
return '';
|
||||
}
|
||||
|
||||
$fc_path = FCPATH.SELF;
|
||||
if (strpos($request_uri, '?') !== FALSE)
|
||||
{
|
||||
$fc_path .= '?';
|
||||
}
|
||||
|
||||
$parsed_uri = explode("/", $request_uri);
|
||||
|
||||
$i = 0;
|
||||
foreach(explode("/", $fc_path) as $segment)
|
||||
{
|
||||
if (isset($parsed_uri[$i]) && $segment == $parsed_uri[$i])
|
||||
{
|
||||
$i++;
|
||||
}
|
||||
}
|
||||
|
||||
$parsed_uri = implode("/", array_slice($parsed_uri, $i));
|
||||
|
||||
if ($parsed_uri != '')
|
||||
{
|
||||
$parsed_uri = '/'.$parsed_uri;
|
||||
}
|
||||
|
||||
return $parsed_uri;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Filter segments for malicious characters
|
||||
*
|
||||
* @access private
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function _filter_uri($str)
|
||||
{
|
||||
if ($str != '' && $this->config->item('permitted_uri_chars') != '' && $this->config->item('enable_query_strings') == FALSE)
|
||||
{
|
||||
// preg_quote() in PHP 5.3 escapes -, so the str_replace() and addition of - to preg_quote() is to maintain backwards
|
||||
// compatibility as many are unaware of how characters in the permitted_uri_chars will be parsed as a regex pattern
|
||||
if ( ! preg_match("|^[".str_replace(array('\\-', '\-'), '-', preg_quote($this->config->item('permitted_uri_chars'), '-'))."]+$|i", $str))
|
||||
{
|
||||
show_error('The URI you submitted has disallowed characters.', 400);
|
||||
}
|
||||
}
|
||||
|
||||
// Convert programatic characters to entities
|
||||
$bad = array('$', '(', ')', '%28', '%29');
|
||||
$good = array('$', '(', ')', '(', ')');
|
||||
|
||||
return str_replace($bad, $good, $str);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Remove the suffix from the URL if needed
|
||||
*
|
||||
* @access private
|
||||
* @return void
|
||||
*/
|
||||
function _remove_url_suffix()
|
||||
{
|
||||
if ($this->config->item('url_suffix') != "")
|
||||
{
|
||||
$this->uri_string = preg_replace("|".preg_quote($this->config->item('url_suffix'))."$|", "", $this->uri_string);
|
||||
}
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Explode the URI Segments. The individual segments will
|
||||
* be stored in the $this->segments array.
|
||||
*
|
||||
* @access private
|
||||
* @return void
|
||||
*/
|
||||
function _explode_segments()
|
||||
{
|
||||
foreach(explode("/", preg_replace("|/*(.+?)/*$|", "\\1", $this->uri_string)) as $val)
|
||||
{
|
||||
// Filter segments for security
|
||||
$val = trim($this->_filter_uri($val));
|
||||
|
||||
if ($val != '')
|
||||
{
|
||||
$this->segments[] = $val;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
/**
|
||||
* Re-index Segments
|
||||
*
|
||||
* This function re-indexes the $this->segment array so that it
|
||||
* starts at 1 rather than 0. Doing so makes it simpler to
|
||||
* use functions like $this->uri->segment(n) since there is
|
||||
* a 1:1 relationship between the segment array and the actual segments.
|
||||
*
|
||||
* @access private
|
||||
* @return void
|
||||
*/
|
||||
function _reindex_segments()
|
||||
{
|
||||
array_unshift($this->segments, NULL);
|
||||
array_unshift($this->rsegments, NULL);
|
||||
unset($this->segments[0]);
|
||||
unset($this->rsegments[0]);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Fetch a URI Segment
|
||||
*
|
||||
* This function returns the URI segment based on the number provided.
|
||||
*
|
||||
* @access public
|
||||
* @param integer
|
||||
* @param bool
|
||||
* @return string
|
||||
*/
|
||||
function segment($n, $no_result = FALSE)
|
||||
{
|
||||
return ( ! isset($this->segments[$n])) ? $no_result : $this->segments[$n];
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Fetch a URI "routed" Segment
|
||||
*
|
||||
* This function returns the re-routed URI segment (assuming routing rules are used)
|
||||
* based on the number provided. If there is no routing this function returns the
|
||||
* same result as $this->segment()
|
||||
*
|
||||
* @access public
|
||||
* @param integer
|
||||
* @param bool
|
||||
* @return string
|
||||
*/
|
||||
function rsegment($n, $no_result = FALSE)
|
||||
{
|
||||
return ( ! isset($this->rsegments[$n])) ? $no_result : $this->rsegments[$n];
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Generate a key value pair from the URI string
|
||||
*
|
||||
* This function generates and associative array of URI data starting
|
||||
* at the supplied segment. For example, if this is your URI:
|
||||
*
|
||||
* example.com/user/search/name/joe/location/UK/gender/male
|
||||
*
|
||||
* You can use this function to generate an array with this prototype:
|
||||
*
|
||||
* array (
|
||||
* name => joe
|
||||
* location => UK
|
||||
* gender => male
|
||||
* )
|
||||
*
|
||||
* @access public
|
||||
* @param integer the starting segment number
|
||||
* @param array an array of default values
|
||||
* @return array
|
||||
*/
|
||||
function uri_to_assoc($n = 3, $default = array())
|
||||
{
|
||||
return $this->_uri_to_assoc($n, $default, 'segment');
|
||||
}
|
||||
/**
|
||||
* Identical to above only it uses the re-routed segment array
|
||||
*
|
||||
*/
|
||||
function ruri_to_assoc($n = 3, $default = array())
|
||||
{
|
||||
return $this->_uri_to_assoc($n, $default, 'rsegment');
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Generate a key value pair from the URI string or Re-routed URI string
|
||||
*
|
||||
* @access private
|
||||
* @param integer the starting segment number
|
||||
* @param array an array of default values
|
||||
* @param string which array we should use
|
||||
* @return array
|
||||
*/
|
||||
function _uri_to_assoc($n = 3, $default = array(), $which = 'segment')
|
||||
{
|
||||
if ($which == 'segment')
|
||||
{
|
||||
$total_segments = 'total_segments';
|
||||
$segment_array = 'segment_array';
|
||||
}
|
||||
else
|
||||
{
|
||||
$total_segments = 'total_rsegments';
|
||||
$segment_array = 'rsegment_array';
|
||||
}
|
||||
|
||||
if ( ! is_numeric($n))
|
||||
{
|
||||
return $default;
|
||||
}
|
||||
|
||||
if (isset($this->keyval[$n]))
|
||||
{
|
||||
return $this->keyval[$n];
|
||||
}
|
||||
|
||||
if ($this->$total_segments() < $n)
|
||||
{
|
||||
if (count($default) == 0)
|
||||
{
|
||||
return array();
|
||||
}
|
||||
|
||||
$retval = array();
|
||||
foreach ($default as $val)
|
||||
{
|
||||
$retval[$val] = FALSE;
|
||||
}
|
||||
return $retval;
|
||||
}
|
||||
|
||||
$segments = array_slice($this->$segment_array(), ($n - 1));
|
||||
|
||||
$i = 0;
|
||||
$lastval = '';
|
||||
$retval = array();
|
||||
foreach ($segments as $seg)
|
||||
{
|
||||
if ($i % 2)
|
||||
{
|
||||
$retval[$lastval] = $seg;
|
||||
}
|
||||
else
|
||||
{
|
||||
$retval[$seg] = FALSE;
|
||||
$lastval = $seg;
|
||||
}
|
||||
|
||||
$i++;
|
||||
}
|
||||
|
||||
if (count($default) > 0)
|
||||
{
|
||||
foreach ($default as $val)
|
||||
{
|
||||
if ( ! array_key_exists($val, $retval))
|
||||
{
|
||||
$retval[$val] = FALSE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Cache the array for reuse
|
||||
$this->keyval[$n] = $retval;
|
||||
return $retval;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Generate a URI string from an associative array
|
||||
*
|
||||
*
|
||||
* @access public
|
||||
* @param array an associative array of key/values
|
||||
* @return array
|
||||
*/
|
||||
function assoc_to_uri($array)
|
||||
{
|
||||
$temp = array();
|
||||
foreach ((array)$array as $key => $val)
|
||||
{
|
||||
$temp[] = $key;
|
||||
$temp[] = $val;
|
||||
}
|
||||
|
||||
return implode('/', $temp);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Fetch a URI Segment and add a trailing slash
|
||||
*
|
||||
* @access public
|
||||
* @param integer
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function slash_segment($n, $where = 'trailing')
|
||||
{
|
||||
return $this->_slash_segment($n, $where, 'segment');
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Fetch a URI Segment and add a trailing slash
|
||||
*
|
||||
* @access public
|
||||
* @param integer
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function slash_rsegment($n, $where = 'trailing')
|
||||
{
|
||||
return $this->_slash_segment($n, $where, 'rsegment');
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Fetch a URI Segment and add a trailing slash - helper function
|
||||
*
|
||||
* @access private
|
||||
* @param integer
|
||||
* @param string
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function _slash_segment($n, $where = 'trailing', $which = 'segment')
|
||||
{
|
||||
if ($where == 'trailing')
|
||||
{
|
||||
$trailing = '/';
|
||||
$leading = '';
|
||||
}
|
||||
elseif ($where == 'leading')
|
||||
{
|
||||
$leading = '/';
|
||||
$trailing = '';
|
||||
}
|
||||
else
|
||||
{
|
||||
$leading = '/';
|
||||
$trailing = '/';
|
||||
}
|
||||
return $leading.$this->$which($n).$trailing;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Segment Array
|
||||
*
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
function segment_array()
|
||||
{
|
||||
return $this->segments;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Routed Segment Array
|
||||
*
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
function rsegment_array()
|
||||
{
|
||||
return $this->rsegments;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Total number of segments
|
||||
*
|
||||
* @access public
|
||||
* @return integer
|
||||
*/
|
||||
function total_segments()
|
||||
{
|
||||
return count($this->segments);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Total number of routed segments
|
||||
*
|
||||
* @access public
|
||||
* @return integer
|
||||
*/
|
||||
function total_rsegments()
|
||||
{
|
||||
return count($this->rsegments);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Fetch the entire URI string
|
||||
*
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
function uri_string()
|
||||
{
|
||||
return $this->uri_string;
|
||||
}
|
||||
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Fetch the entire Re-routed URI string
|
||||
*
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
function ruri_string()
|
||||
{
|
||||
return '/'.implode('/', $this->rsegment_array()).'/';
|
||||
}
|
||||
|
||||
}
|
||||
// END URI Class
|
||||
|
||||
/* End of file URI.php */
|
||||
/* Location: ./system/libraries/URI.php */
|
||||
@@ -0,0 +1,347 @@
|
||||
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
/**
|
||||
* CodeIgniter
|
||||
*
|
||||
* An open source application development framework for PHP 4.3.2 or newer
|
||||
*
|
||||
* @package CodeIgniter
|
||||
* @author ExpressionEngine Dev Team
|
||||
* @copyright Copyright (c) 2008 - 2010, EllisLab, Inc.
|
||||
* @license http://codeigniter.com/user_guide/license.html
|
||||
* @link http://codeigniter.com
|
||||
* @since Version 1.3.1
|
||||
* @filesource
|
||||
*/
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Unit Testing Class
|
||||
*
|
||||
* Simple testing class
|
||||
*
|
||||
* @package CodeIgniter
|
||||
* @subpackage Libraries
|
||||
* @category UnitTesting
|
||||
* @author ExpressionEngine Dev Team
|
||||
* @link http://codeigniter.com/user_guide/libraries/uri.html
|
||||
*/
|
||||
class CI_Unit_test {
|
||||
|
||||
var $active = TRUE;
|
||||
var $results = array();
|
||||
var $strict = FALSE;
|
||||
var $_template = NULL;
|
||||
var $_template_rows = NULL;
|
||||
|
||||
function CI_Unit_test()
|
||||
{
|
||||
log_message('debug', "Unit Testing Class Initialized");
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Run the tests
|
||||
*
|
||||
* Runs the supplied tests
|
||||
*
|
||||
* @access public
|
||||
* @param mixed
|
||||
* @param mixed
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function run($test, $expected = TRUE, $test_name = 'undefined')
|
||||
{
|
||||
if ($this->active == FALSE)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (in_array($expected, array('is_string', 'is_bool', 'is_true', 'is_false', 'is_int', 'is_numeric', 'is_float', 'is_double', 'is_array', 'is_null'), TRUE))
|
||||
{
|
||||
$expected = str_replace('is_float', 'is_double', $expected);
|
||||
$result = ($expected($test)) ? TRUE : FALSE;
|
||||
$extype = str_replace(array('true', 'false'), 'bool', str_replace('is_', '', $expected));
|
||||
}
|
||||
else
|
||||
{
|
||||
if ($this->strict == TRUE)
|
||||
$result = ($test === $expected) ? TRUE : FALSE;
|
||||
else
|
||||
$result = ($test == $expected) ? TRUE : FALSE;
|
||||
|
||||
$extype = gettype($expected);
|
||||
}
|
||||
|
||||
$back = $this->_backtrace();
|
||||
|
||||
$report[] = array (
|
||||
'test_name' => $test_name,
|
||||
'test_datatype' => gettype($test),
|
||||
'res_datatype' => $extype,
|
||||
'result' => ($result === TRUE) ? 'passed' : 'failed',
|
||||
'file' => $back['file'],
|
||||
'line' => $back['line']
|
||||
);
|
||||
|
||||
$this->results[] = $report;
|
||||
|
||||
return($this->report($this->result($report)));
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Generate a report
|
||||
*
|
||||
* Displays a table with the test data
|
||||
*
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
function report($result = array())
|
||||
{
|
||||
if (count($result) == 0)
|
||||
{
|
||||
$result = $this->result();
|
||||
}
|
||||
|
||||
$CI =& get_instance();
|
||||
$CI->load->language('unit_test');
|
||||
|
||||
$this->_parse_template();
|
||||
|
||||
$r = '';
|
||||
foreach ($result as $res)
|
||||
{
|
||||
$table = '';
|
||||
|
||||
foreach ($res as $key => $val)
|
||||
{
|
||||
|
||||
if ($key == $CI->lang->line('ut_result'))
|
||||
{
|
||||
if ($val == $CI->lang->line('ut_passed'))
|
||||
{
|
||||
$val = '<span style="color: #0C0;">'.$val.'</span>';
|
||||
}
|
||||
elseif ($val == $CI->lang->line('ut_failed'))
|
||||
{
|
||||
$val = '<span style="color: #C00;">'.$val.'</span>';
|
||||
}
|
||||
}
|
||||
|
||||
$temp = $this->_template_rows;
|
||||
$temp = str_replace('{item}', $key, $temp);
|
||||
$temp = str_replace('{result}', $val, $temp);
|
||||
$table .= $temp;
|
||||
}
|
||||
|
||||
$r .= str_replace('{rows}', $table, $this->_template);
|
||||
}
|
||||
|
||||
return $r;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Use strict comparison
|
||||
*
|
||||
* Causes the evaluation to use === rather than ==
|
||||
*
|
||||
* @access public
|
||||
* @param bool
|
||||
* @return null
|
||||
*/
|
||||
function use_strict($state = TRUE)
|
||||
{
|
||||
$this->strict = ($state == FALSE) ? FALSE : TRUE;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Make Unit testing active
|
||||
*
|
||||
* Enables/disables unit testing
|
||||
*
|
||||
* @access public
|
||||
* @param bool
|
||||
* @return null
|
||||
*/
|
||||
function active($state = TRUE)
|
||||
{
|
||||
$this->active = ($state == FALSE) ? FALSE : TRUE;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Result Array
|
||||
*
|
||||
* Returns the raw result data
|
||||
*
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
function result($results = array())
|
||||
{
|
||||
$CI =& get_instance();
|
||||
$CI->load->language('unit_test');
|
||||
|
||||
if (count($results) == 0)
|
||||
{
|
||||
$results = $this->results;
|
||||
}
|
||||
|
||||
$retval = array();
|
||||
foreach ($results as $result)
|
||||
{
|
||||
$temp = array();
|
||||
foreach ($result as $key => $val)
|
||||
{
|
||||
if (is_array($val))
|
||||
{
|
||||
foreach ($val as $k => $v)
|
||||
{
|
||||
if (FALSE !== ($line = $CI->lang->line(strtolower('ut_'.$v))))
|
||||
{
|
||||
$v = $line;
|
||||
}
|
||||
$temp[$CI->lang->line('ut_'.$k)] = $v;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (FALSE !== ($line = $CI->lang->line(strtolower('ut_'.$val))))
|
||||
{
|
||||
$val = $line;
|
||||
}
|
||||
$temp[$CI->lang->line('ut_'.$key)] = $val;
|
||||
}
|
||||
}
|
||||
|
||||
$retval[] = $temp;
|
||||
}
|
||||
|
||||
return $retval;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Set the template
|
||||
*
|
||||
* This lets us set the template to be used to display results
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @return void
|
||||
*/
|
||||
function set_template($template)
|
||||
{
|
||||
$this->_template = $template;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Generate a backtrace
|
||||
*
|
||||
* This lets us show file names and line numbers
|
||||
*
|
||||
* @access private
|
||||
* @return array
|
||||
*/
|
||||
function _backtrace()
|
||||
{
|
||||
if (function_exists('debug_backtrace'))
|
||||
{
|
||||
$back = debug_backtrace();
|
||||
|
||||
$file = ( ! isset($back['1']['file'])) ? '' : $back['1']['file'];
|
||||
$line = ( ! isset($back['1']['line'])) ? '' : $back['1']['line'];
|
||||
|
||||
return array('file' => $file, 'line' => $line);
|
||||
}
|
||||
return array('file' => 'Unknown', 'line' => 'Unknown');
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Get Default Template
|
||||
*
|
||||
* @access private
|
||||
* @return string
|
||||
*/
|
||||
function _default_template()
|
||||
{
|
||||
$this->_template = "\n".'<table style="width:100%; font-size:small; margin:10px 0; border-collapse:collapse; border:1px solid #CCC;">';
|
||||
$this->_template .= '{rows}';
|
||||
$this->_template .= "\n".'</table>';
|
||||
|
||||
$this->_template_rows = "\n\t".'<tr>';
|
||||
$this->_template_rows .= "\n\t\t".'<th style="text-align: left; border-bottom:1px solid #CCC;">{item}</th>';
|
||||
$this->_template_rows .= "\n\t\t".'<td style="border-bottom:1px solid #CCC;">{result}</td>';
|
||||
$this->_template_rows .= "\n\t".'</tr>';
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Parse Template
|
||||
*
|
||||
* Harvests the data within the template {pseudo-variables}
|
||||
*
|
||||
* @access private
|
||||
* @return void
|
||||
*/
|
||||
function _parse_template()
|
||||
{
|
||||
if ( ! is_null($this->_template_rows))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (is_null($this->_template))
|
||||
{
|
||||
$this->_default_template();
|
||||
return;
|
||||
}
|
||||
|
||||
if ( ! preg_match("/\{rows\}(.*?)\{\/rows\}/si", $this->_template, $match))
|
||||
{
|
||||
$this->_default_template();
|
||||
return;
|
||||
}
|
||||
|
||||
$this->_template_rows = $match['1'];
|
||||
$this->_template = str_replace($match['0'], '{rows}', $this->_template);
|
||||
}
|
||||
|
||||
}
|
||||
// END Unit_test Class
|
||||
|
||||
/**
|
||||
* Helper functions to test boolean true/false
|
||||
*
|
||||
*
|
||||
* @access private
|
||||
* @return bool
|
||||
*/
|
||||
function is_true($test)
|
||||
{
|
||||
return (is_bool($test) AND $test === TRUE) ? TRUE : FALSE;
|
||||
}
|
||||
function is_false($test)
|
||||
{
|
||||
return (is_bool($test) AND $test === FALSE) ? TRUE : FALSE;
|
||||
}
|
||||
|
||||
|
||||
/* End of file Unit_test.php */
|
||||
/* Location: ./system/libraries/Unit_test.php */
|
||||
@@ -0,0 +1,970 @@
|
||||
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
/**
|
||||
* CodeIgniter
|
||||
*
|
||||
* An open source application development framework for PHP 4.3.2 or newer
|
||||
*
|
||||
* @package CodeIgniter
|
||||
* @author ExpressionEngine Dev Team
|
||||
* @copyright Copyright (c) 2008 - 2010, EllisLab, Inc.
|
||||
* @license http://codeigniter.com/user_guide/license.html
|
||||
* @link http://codeigniter.com
|
||||
* @since Version 1.0
|
||||
* @filesource
|
||||
*/
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* File Uploading Class
|
||||
*
|
||||
* @package CodeIgniter
|
||||
* @subpackage Libraries
|
||||
* @category Uploads
|
||||
* @author ExpressionEngine Dev Team
|
||||
* @link http://codeigniter.com/user_guide/libraries/file_uploading.html
|
||||
*/
|
||||
class CI_Upload {
|
||||
|
||||
var $max_size = 0;
|
||||
var $max_width = 0;
|
||||
var $max_height = 0;
|
||||
var $max_filename = 0;
|
||||
var $allowed_types = "";
|
||||
var $file_temp = "";
|
||||
var $file_name = "";
|
||||
var $orig_name = "";
|
||||
var $file_type = "";
|
||||
var $file_size = "";
|
||||
var $file_ext = "";
|
||||
var $upload_path = "";
|
||||
var $overwrite = FALSE;
|
||||
var $encrypt_name = FALSE;
|
||||
var $is_image = FALSE;
|
||||
var $image_width = '';
|
||||
var $image_height = '';
|
||||
var $image_type = '';
|
||||
var $image_size_str = '';
|
||||
var $error_msg = array();
|
||||
var $mimes = array();
|
||||
var $remove_spaces = TRUE;
|
||||
var $xss_clean = FALSE;
|
||||
var $temp_prefix = "temp_file_";
|
||||
var $client_name = '';
|
||||
|
||||
var $_file_name_override = '';
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @access public
|
||||
*/
|
||||
function CI_Upload($props = array())
|
||||
{
|
||||
if (count($props) > 0)
|
||||
{
|
||||
$this->initialize($props);
|
||||
}
|
||||
|
||||
log_message('debug', "Upload Class Initialized");
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Initialize preferences
|
||||
*
|
||||
* @access public
|
||||
* @param array
|
||||
* @return void
|
||||
*/
|
||||
function initialize($config = array())
|
||||
{
|
||||
$defaults = array(
|
||||
'max_size' => 0,
|
||||
'max_width' => 0,
|
||||
'max_height' => 0,
|
||||
'max_filename' => 0,
|
||||
'allowed_types' => "",
|
||||
'file_temp' => "",
|
||||
'file_name' => "",
|
||||
'orig_name' => "",
|
||||
'file_type' => "",
|
||||
'file_size' => "",
|
||||
'file_ext' => "",
|
||||
'upload_path' => "",
|
||||
'overwrite' => FALSE,
|
||||
'encrypt_name' => FALSE,
|
||||
'is_image' => FALSE,
|
||||
'image_width' => '',
|
||||
'image_height' => '',
|
||||
'image_type' => '',
|
||||
'image_size_str' => '',
|
||||
'error_msg' => array(),
|
||||
'mimes' => array(),
|
||||
'remove_spaces' => TRUE,
|
||||
'xss_clean' => FALSE,
|
||||
'temp_prefix' => "temp_file_",
|
||||
'client_name' => ''
|
||||
);
|
||||
|
||||
|
||||
foreach ($defaults as $key => $val)
|
||||
{
|
||||
if (isset($config[$key]))
|
||||
{
|
||||
$method = 'set_'.$key;
|
||||
if (method_exists($this, $method))
|
||||
{
|
||||
$this->$method($config[$key]);
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->$key = $config[$key];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->$key = $val;
|
||||
}
|
||||
}
|
||||
|
||||
// if a file_name was provided in the config, use it instead of the user input
|
||||
// supplied file name for all uploads until initialized again
|
||||
$this->_file_name_override = $this->file_name;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Perform the file upload
|
||||
*
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
function do_upload($field = 'userfile')
|
||||
{
|
||||
// Is $_FILES[$field] set? If not, no reason to continue.
|
||||
if ( ! isset($_FILES[$field]))
|
||||
{
|
||||
$this->set_error('upload_no_file_selected');
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// Is the upload path valid?
|
||||
if ( ! $this->validate_upload_path())
|
||||
{
|
||||
// errors will already be set by validate_upload_path() so just return FALSE
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// Was the file able to be uploaded? If not, determine the reason why.
|
||||
if ( ! is_uploaded_file($_FILES[$field]['tmp_name']))
|
||||
{
|
||||
$error = ( ! isset($_FILES[$field]['error'])) ? 4 : $_FILES[$field]['error'];
|
||||
|
||||
switch($error)
|
||||
{
|
||||
case 1: // UPLOAD_ERR_INI_SIZE
|
||||
$this->set_error('upload_file_exceeds_limit');
|
||||
break;
|
||||
case 2: // UPLOAD_ERR_FORM_SIZE
|
||||
$this->set_error('upload_file_exceeds_form_limit');
|
||||
break;
|
||||
case 3: // UPLOAD_ERR_PARTIAL
|
||||
$this->set_error('upload_file_partial');
|
||||
break;
|
||||
case 4: // UPLOAD_ERR_NO_FILE
|
||||
$this->set_error('upload_no_file_selected');
|
||||
break;
|
||||
case 6: // UPLOAD_ERR_NO_TMP_DIR
|
||||
$this->set_error('upload_no_temp_directory');
|
||||
break;
|
||||
case 7: // UPLOAD_ERR_CANT_WRITE
|
||||
$this->set_error('upload_unable_to_write_file');
|
||||
break;
|
||||
case 8: // UPLOAD_ERR_EXTENSION
|
||||
$this->set_error('upload_stopped_by_extension');
|
||||
break;
|
||||
default : $this->set_error('upload_no_file_selected');
|
||||
break;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// Set the uploaded data as class variables
|
||||
$this->file_temp = $_FILES[$field]['tmp_name'];
|
||||
$this->file_size = $_FILES[$field]['size'];
|
||||
$this->file_type = preg_replace("/^(.+?);.*$/", "\\1", $_FILES[$field]['type']);
|
||||
$this->file_type = strtolower(trim(stripslashes($this->file_type), '"'));
|
||||
$this->file_name = $this->_prep_filename($_FILES[$field]['name']);
|
||||
$this->file_ext = $this->get_extension($this->file_name);
|
||||
$this->client_name = $this->file_name;
|
||||
|
||||
// Is the file type allowed to be uploaded?
|
||||
if ( ! $this->is_allowed_filetype())
|
||||
{
|
||||
$this->set_error('upload_invalid_filetype');
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// if we're overriding, let's now make sure the new name and type is allowed
|
||||
if ($this->_file_name_override != '')
|
||||
{
|
||||
$this->file_name = $this->_prep_filename($this->_file_name_override);
|
||||
$this->file_ext = $this->get_extension($this->file_name);
|
||||
|
||||
if ( ! $this->is_allowed_filetype(TRUE))
|
||||
{
|
||||
$this->set_error('upload_invalid_filetype');
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
// Convert the file size to kilobytes
|
||||
if ($this->file_size > 0)
|
||||
{
|
||||
$this->file_size = round($this->file_size/1024, 2);
|
||||
}
|
||||
|
||||
// Is the file size within the allowed maximum?
|
||||
if ( ! $this->is_allowed_filesize())
|
||||
{
|
||||
$this->set_error('upload_invalid_filesize');
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// Are the image dimensions within the allowed size?
|
||||
// Note: This can fail if the server has an open_basdir restriction.
|
||||
if ( ! $this->is_allowed_dimensions())
|
||||
{
|
||||
$this->set_error('upload_invalid_dimensions');
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// Sanitize the file name for security
|
||||
$this->file_name = $this->clean_file_name($this->file_name);
|
||||
|
||||
// Truncate the file name if it's too long
|
||||
if ($this->max_filename > 0)
|
||||
{
|
||||
$this->file_name = $this->limit_filename_length($this->file_name, $this->max_filename);
|
||||
}
|
||||
|
||||
// Remove white spaces in the name
|
||||
if ($this->remove_spaces == TRUE)
|
||||
{
|
||||
$this->file_name = preg_replace("/\s+/", "_", $this->file_name);
|
||||
}
|
||||
|
||||
/*
|
||||
* Validate the file name
|
||||
* This function appends an number onto the end of
|
||||
* the file if one with the same name already exists.
|
||||
* If it returns false there was a problem.
|
||||
*/
|
||||
$this->orig_name = $this->file_name;
|
||||
|
||||
if ($this->overwrite == FALSE)
|
||||
{
|
||||
$this->file_name = $this->set_filename($this->upload_path, $this->file_name);
|
||||
|
||||
if ($this->file_name === FALSE)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Move the file to the final destination
|
||||
* To deal with different server configurations
|
||||
* we'll attempt to use copy() first. If that fails
|
||||
* we'll use move_uploaded_file(). One of the two should
|
||||
* reliably work in most environments
|
||||
*/
|
||||
if ( ! @copy($this->file_temp, $this->upload_path.$this->file_name))
|
||||
{
|
||||
if ( ! @move_uploaded_file($this->file_temp, $this->upload_path.$this->file_name))
|
||||
{
|
||||
$this->set_error('upload_destination_error');
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Run the file through the XSS hacking filter
|
||||
* This helps prevent malicious code from being
|
||||
* embedded within a file. Scripts can easily
|
||||
* be disguised as images or other file types.
|
||||
*/
|
||||
if ($this->xss_clean == TRUE)
|
||||
{
|
||||
$this->do_xss_clean();
|
||||
}
|
||||
|
||||
/*
|
||||
* Set the finalized image dimensions
|
||||
* This sets the image width/height (assuming the
|
||||
* file was an image). We use this information
|
||||
* in the "data" function.
|
||||
*/
|
||||
$this->set_image_properties($this->upload_path.$this->file_name);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Finalized Data Array
|
||||
*
|
||||
* Returns an associative array containing all of the information
|
||||
* related to the upload, allowing the developer easy access in one array.
|
||||
*
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
function data()
|
||||
{
|
||||
return array (
|
||||
'file_name' => $this->file_name,
|
||||
'file_type' => $this->file_type,
|
||||
'file_path' => $this->upload_path,
|
||||
'full_path' => $this->upload_path.$this->file_name,
|
||||
'raw_name' => str_replace($this->file_ext, '', $this->file_name),
|
||||
'orig_name' => $this->orig_name,
|
||||
'client_name' => $this->client_name,
|
||||
'file_ext' => $this->file_ext,
|
||||
'file_size' => $this->file_size,
|
||||
'is_image' => $this->is_image(),
|
||||
'image_width' => $this->image_width,
|
||||
'image_height' => $this->image_height,
|
||||
'image_type' => $this->image_type,
|
||||
'image_size_str' => $this->image_size_str,
|
||||
);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Set Upload Path
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @return void
|
||||
*/
|
||||
function set_upload_path($path)
|
||||
{
|
||||
// Make sure it has a trailing slash
|
||||
$this->upload_path = rtrim($path, '/').'/';
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Set the file name
|
||||
*
|
||||
* This function takes a filename/path as input and looks for the
|
||||
* existence of a file with the same name. If found, it will append a
|
||||
* number to the end of the filename to avoid overwriting a pre-existing file.
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function set_filename($path, $filename)
|
||||
{
|
||||
if ($this->encrypt_name == TRUE)
|
||||
{
|
||||
mt_srand();
|
||||
$filename = md5(uniqid(mt_rand())).$this->file_ext;
|
||||
}
|
||||
|
||||
if ( ! file_exists($path.$filename))
|
||||
{
|
||||
return $filename;
|
||||
}
|
||||
|
||||
$filename = str_replace($this->file_ext, '', $filename);
|
||||
|
||||
$new_filename = '';
|
||||
for ($i = 1; $i < 100; $i++)
|
||||
{
|
||||
if ( ! file_exists($path.$filename.$i.$this->file_ext))
|
||||
{
|
||||
$new_filename = $filename.$i.$this->file_ext;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ($new_filename == '')
|
||||
{
|
||||
$this->set_error('upload_bad_filename');
|
||||
return FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
return $new_filename;
|
||||
}
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Set Maximum File Size
|
||||
*
|
||||
* @access public
|
||||
* @param integer
|
||||
* @return void
|
||||
*/
|
||||
function set_max_filesize($n)
|
||||
{
|
||||
$this->max_size = ((int) $n < 0) ? 0: (int) $n;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Set Maximum File Name Length
|
||||
*
|
||||
* @access public
|
||||
* @param integer
|
||||
* @return void
|
||||
*/
|
||||
function set_max_filename($n)
|
||||
{
|
||||
$this->max_filename = ((int) $n < 0) ? 0: (int) $n;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Set Maximum Image Width
|
||||
*
|
||||
* @access public
|
||||
* @param integer
|
||||
* @return void
|
||||
*/
|
||||
function set_max_width($n)
|
||||
{
|
||||
$this->max_width = ((int) $n < 0) ? 0: (int) $n;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Set Maximum Image Height
|
||||
*
|
||||
* @access public
|
||||
* @param integer
|
||||
* @return void
|
||||
*/
|
||||
function set_max_height($n)
|
||||
{
|
||||
$this->max_height = ((int) $n < 0) ? 0: (int) $n;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Set Allowed File Types
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @return void
|
||||
*/
|
||||
function set_allowed_types($types)
|
||||
{
|
||||
$this->allowed_types = explode('|', $types);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Set Image Properties
|
||||
*
|
||||
* Uses GD to determine the width/height/type of image
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @return void
|
||||
*/
|
||||
function set_image_properties($path = '')
|
||||
{
|
||||
if ( ! $this->is_image())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (function_exists('getimagesize'))
|
||||
{
|
||||
if (FALSE !== ($D = @getimagesize($path)))
|
||||
{
|
||||
$types = array(1 => 'gif', 2 => 'jpeg', 3 => 'png');
|
||||
|
||||
$this->image_width = $D['0'];
|
||||
$this->image_height = $D['1'];
|
||||
$this->image_type = ( ! isset($types[$D['2']])) ? 'unknown' : $types[$D['2']];
|
||||
$this->image_size_str = $D['3']; // string containing height and width
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Set XSS Clean
|
||||
*
|
||||
* Enables the XSS flag so that the file that was uploaded
|
||||
* will be run through the XSS filter.
|
||||
*
|
||||
* @access public
|
||||
* @param bool
|
||||
* @return void
|
||||
*/
|
||||
function set_xss_clean($flag = FALSE)
|
||||
{
|
||||
$this->xss_clean = ($flag == TRUE) ? TRUE : FALSE;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Validate the image
|
||||
*
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
function is_image()
|
||||
{
|
||||
// IE will sometimes return odd mime-types during upload, so here we just standardize all
|
||||
// jpegs or pngs to the same file type.
|
||||
|
||||
$png_mimes = array('image/x-png');
|
||||
$jpeg_mimes = array('image/jpg', 'image/jpe', 'image/jpeg', 'image/pjpeg');
|
||||
|
||||
if (in_array($this->file_type, $png_mimes))
|
||||
{
|
||||
$this->file_type = 'image/png';
|
||||
}
|
||||
|
||||
if (in_array($this->file_type, $jpeg_mimes))
|
||||
{
|
||||
$this->file_type = 'image/jpeg';
|
||||
}
|
||||
|
||||
$img_mimes = array(
|
||||
'image/gif',
|
||||
'image/jpeg',
|
||||
'image/png',
|
||||
);
|
||||
|
||||
return (in_array($this->file_type, $img_mimes, TRUE)) ? TRUE : FALSE;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Verify that the filetype is allowed
|
||||
*
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
function is_allowed_filetype($ignore_mime = FALSE)
|
||||
{
|
||||
if (count($this->allowed_types) == 0 OR ! is_array($this->allowed_types))
|
||||
{
|
||||
$this->set_error('upload_no_file_types');
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
$ext = strtolower(ltrim($this->file_ext, '.'));
|
||||
|
||||
if ( ! in_array($ext, $this->allowed_types))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// Images get some additional checks
|
||||
$image_types = array('gif', 'jpg', 'jpeg', 'png', 'jpe');
|
||||
|
||||
if (in_array($ext, $image_types))
|
||||
{
|
||||
if (getimagesize($this->file_temp) === FALSE)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
if ($ignore_mime === TRUE)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
$mime = $this->mimes_types($ext);
|
||||
|
||||
if (is_array($mime))
|
||||
{
|
||||
if (in_array($this->file_type, $mime, TRUE))
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
elseif ($mime == $this->file_type)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Verify that the file is within the allowed size
|
||||
*
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
function is_allowed_filesize()
|
||||
{
|
||||
if ($this->max_size != 0 AND $this->file_size > $this->max_size)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Verify that the image is within the allowed width/height
|
||||
*
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
function is_allowed_dimensions()
|
||||
{
|
||||
if ( ! $this->is_image())
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
if (function_exists('getimagesize'))
|
||||
{
|
||||
$D = @getimagesize($this->file_temp);
|
||||
|
||||
if ($this->max_width > 0 AND $D['0'] > $this->max_width)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if ($this->max_height > 0 AND $D['1'] > $this->max_height)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Validate Upload Path
|
||||
*
|
||||
* Verifies that it is a valid upload path with proper permissions.
|
||||
*
|
||||
*
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
function validate_upload_path()
|
||||
{
|
||||
if ($this->upload_path == '')
|
||||
{
|
||||
$this->set_error('upload_no_filepath');
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (function_exists('realpath') AND @realpath($this->upload_path) !== FALSE)
|
||||
{
|
||||
$this->upload_path = str_replace("\\", "/", realpath($this->upload_path));
|
||||
}
|
||||
|
||||
if ( ! @is_dir($this->upload_path))
|
||||
{
|
||||
$this->set_error('upload_no_filepath');
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if ( ! is_really_writable($this->upload_path))
|
||||
{
|
||||
$this->set_error('upload_not_writable');
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
$this->upload_path = preg_replace("/(.+?)\/*$/", "\\1/", $this->upload_path);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Extract the file extension
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function get_extension($filename)
|
||||
{
|
||||
$x = explode('.', $filename);
|
||||
return '.'.end($x);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Clean the file name for security
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function clean_file_name($filename)
|
||||
{
|
||||
$bad = array(
|
||||
"<!--",
|
||||
"-->",
|
||||
"'",
|
||||
"<",
|
||||
">",
|
||||
'"',
|
||||
'&',
|
||||
'$',
|
||||
'=',
|
||||
';',
|
||||
'?',
|
||||
'/',
|
||||
"%20",
|
||||
"%22",
|
||||
"%3c", // <
|
||||
"%253c", // <
|
||||
"%3e", // >
|
||||
"%0e", // >
|
||||
"%28", // (
|
||||
"%29", // )
|
||||
"%2528", // (
|
||||
"%26", // &
|
||||
"%24", // $
|
||||
"%3f", // ?
|
||||
"%3b", // ;
|
||||
"%3d" // =
|
||||
);
|
||||
|
||||
$filename = str_replace($bad, '', $filename);
|
||||
|
||||
return stripslashes($filename);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Limit the File Name Length
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function limit_filename_length($filename, $length)
|
||||
{
|
||||
if (strlen($filename) < $length)
|
||||
{
|
||||
return $filename;
|
||||
}
|
||||
|
||||
$ext = '';
|
||||
if (strpos($filename, '.') !== FALSE)
|
||||
{
|
||||
$parts = explode('.', $filename);
|
||||
$ext = '.'.array_pop($parts);
|
||||
$filename = implode('.', $parts);
|
||||
}
|
||||
|
||||
return substr($filename, 0, ($length - strlen($ext))).$ext;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Runs the file through the XSS clean function
|
||||
*
|
||||
* This prevents people from embedding malicious code in their files.
|
||||
* I'm not sure that it won't negatively affect certain files in unexpected ways,
|
||||
* but so far I haven't found that it causes trouble.
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
function do_xss_clean()
|
||||
{
|
||||
$file = $this->upload_path.$this->file_name;
|
||||
|
||||
if (filesize($file) == 0)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (($data = @file_get_contents($file)) === FALSE)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if ( ! $fp = @fopen($file, FOPEN_READ_WRITE))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
$CI =& get_instance();
|
||||
$data = $CI->input->xss_clean($data);
|
||||
|
||||
flock($fp, LOCK_EX);
|
||||
fwrite($fp, $data);
|
||||
flock($fp, LOCK_UN);
|
||||
fclose($fp);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Set an error message
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @return void
|
||||
*/
|
||||
function set_error($msg)
|
||||
{
|
||||
$CI =& get_instance();
|
||||
$CI->lang->load('upload');
|
||||
|
||||
if (is_array($msg))
|
||||
{
|
||||
foreach ($msg as $val)
|
||||
{
|
||||
$msg = ($CI->lang->line($val) == FALSE) ? $val : $CI->lang->line($val);
|
||||
$this->error_msg[] = $msg;
|
||||
log_message('error', $msg);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$msg = ($CI->lang->line($msg) == FALSE) ? $msg : $CI->lang->line($msg);
|
||||
$this->error_msg[] = $msg;
|
||||
log_message('error', $msg);
|
||||
}
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Display the error message
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function display_errors($open = '<p>', $close = '</p>')
|
||||
{
|
||||
$str = '';
|
||||
foreach ($this->error_msg as $val)
|
||||
{
|
||||
$str .= $open.$val.$close;
|
||||
}
|
||||
|
||||
return $str;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* List of Mime Types
|
||||
*
|
||||
* This is a list of mime types. We use it to validate
|
||||
* the "allowed types" set by the developer
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function mimes_types($mime)
|
||||
{
|
||||
global $mimes;
|
||||
|
||||
if (count($this->mimes) == 0)
|
||||
{
|
||||
if (@require_once(APPPATH.'config/mimes'.EXT))
|
||||
{
|
||||
$this->mimes = $mimes;
|
||||
unset($mimes);
|
||||
}
|
||||
}
|
||||
|
||||
return ( ! isset($this->mimes[$mime])) ? FALSE : $this->mimes[$mime];
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Prep Filename
|
||||
*
|
||||
* Prevents possible script execution from Apache's handling of files multiple extensions
|
||||
* http://httpd.apache.org/docs/1.3/mod/mod_mime.html#multipleext
|
||||
*
|
||||
* @access private
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function _prep_filename($filename)
|
||||
{
|
||||
if (strpos($filename, '.') === FALSE)
|
||||
{
|
||||
return $filename;
|
||||
}
|
||||
|
||||
$parts = explode('.', $filename);
|
||||
$ext = array_pop($parts);
|
||||
$filename = array_shift($parts);
|
||||
|
||||
foreach ($parts as $part)
|
||||
{
|
||||
if ( ! in_array(strtolower($part), $this->allowed_types) OR $this->mimes_types(strtolower($part)) === FALSE)
|
||||
{
|
||||
$filename .= '.'.$part.'_';
|
||||
}
|
||||
else
|
||||
{
|
||||
$filename .= '.'.$part;
|
||||
}
|
||||
}
|
||||
|
||||
$filename .= '.'.$ext;
|
||||
|
||||
return $filename;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
}
|
||||
// END Upload Class
|
||||
|
||||
/* End of file Upload.php */
|
||||
/* Location: ./system/libraries/Upload.php */
|
||||
@@ -0,0 +1,502 @@
|
||||
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
/**
|
||||
* CodeIgniter
|
||||
*
|
||||
* An open source application development framework for PHP 4.3.2 or newer
|
||||
*
|
||||
* @package CodeIgniter
|
||||
* @author ExpressionEngine Dev Team
|
||||
* @copyright Copyright (c) 2008 - 2010, EllisLab, Inc.
|
||||
* @license http://codeigniter.com/user_guide/license.html
|
||||
* @link http://codeigniter.com
|
||||
* @since Version 1.0
|
||||
* @filesource
|
||||
*/
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* User Agent Class
|
||||
*
|
||||
* Identifies the platform, browser, robot, or mobile devise of the browsing agent
|
||||
*
|
||||
* @package CodeIgniter
|
||||
* @subpackage Libraries
|
||||
* @category User Agent
|
||||
* @author ExpressionEngine Dev Team
|
||||
* @link http://codeigniter.com/user_guide/libraries/user_agent.html
|
||||
*/
|
||||
class CI_User_agent {
|
||||
|
||||
var $agent = NULL;
|
||||
|
||||
var $is_browser = FALSE;
|
||||
var $is_robot = FALSE;
|
||||
var $is_mobile = FALSE;
|
||||
|
||||
var $languages = array();
|
||||
var $charsets = array();
|
||||
|
||||
var $platforms = array();
|
||||
var $browsers = array();
|
||||
var $mobiles = array();
|
||||
var $robots = array();
|
||||
|
||||
var $platform = '';
|
||||
var $browser = '';
|
||||
var $version = '';
|
||||
var $mobile = '';
|
||||
var $robot = '';
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* Sets the User Agent and runs the compilation routine
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
function CI_User_agent()
|
||||
{
|
||||
if (isset($_SERVER['HTTP_USER_AGENT']))
|
||||
{
|
||||
$this->agent = trim($_SERVER['HTTP_USER_AGENT']);
|
||||
}
|
||||
|
||||
if ( ! is_null($this->agent))
|
||||
{
|
||||
if ($this->_load_agent_file())
|
||||
{
|
||||
$this->_compile_data();
|
||||
}
|
||||
}
|
||||
|
||||
log_message('debug', "User Agent Class Initialized");
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Compile the User Agent Data
|
||||
*
|
||||
* @access private
|
||||
* @return bool
|
||||
*/
|
||||
function _load_agent_file()
|
||||
{
|
||||
if ( ! @include(APPPATH.'config/user_agents'.EXT))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
$return = FALSE;
|
||||
|
||||
if (isset($platforms))
|
||||
{
|
||||
$this->platforms = $platforms;
|
||||
unset($platforms);
|
||||
$return = TRUE;
|
||||
}
|
||||
|
||||
if (isset($browsers))
|
||||
{
|
||||
$this->browsers = $browsers;
|
||||
unset($browsers);
|
||||
$return = TRUE;
|
||||
}
|
||||
|
||||
if (isset($mobiles))
|
||||
{
|
||||
$this->mobiles = $mobiles;
|
||||
unset($mobiles);
|
||||
$return = TRUE;
|
||||
}
|
||||
|
||||
if (isset($robots))
|
||||
{
|
||||
$this->robots = $robots;
|
||||
unset($robots);
|
||||
$return = TRUE;
|
||||
}
|
||||
|
||||
return $return;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Compile the User Agent Data
|
||||
*
|
||||
* @access private
|
||||
* @return bool
|
||||
*/
|
||||
function _compile_data()
|
||||
{
|
||||
$this->_set_platform();
|
||||
|
||||
foreach (array('_set_browser', '_set_robot', '_set_mobile') as $function)
|
||||
{
|
||||
if ($this->$function() === TRUE)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Set the Platform
|
||||
*
|
||||
* @access private
|
||||
* @return mixed
|
||||
*/
|
||||
function _set_platform()
|
||||
{
|
||||
if (is_array($this->platforms) AND count($this->platforms) > 0)
|
||||
{
|
||||
foreach ($this->platforms as $key => $val)
|
||||
{
|
||||
if (preg_match("|".preg_quote($key)."|i", $this->agent))
|
||||
{
|
||||
$this->platform = $val;
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
$this->platform = 'Unknown Platform';
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Set the Browser
|
||||
*
|
||||
* @access private
|
||||
* @return bool
|
||||
*/
|
||||
function _set_browser()
|
||||
{
|
||||
if (is_array($this->browsers) AND count($this->browsers) > 0)
|
||||
{
|
||||
foreach ($this->browsers as $key => $val)
|
||||
{
|
||||
if (preg_match("|".preg_quote($key).".*?([0-9\.]+)|i", $this->agent, $match))
|
||||
{
|
||||
$this->is_browser = TRUE;
|
||||
$this->version = $match[1];
|
||||
$this->browser = $val;
|
||||
$this->_set_mobile();
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Set the Robot
|
||||
*
|
||||
* @access private
|
||||
* @return bool
|
||||
*/
|
||||
function _set_robot()
|
||||
{
|
||||
if (is_array($this->robots) AND count($this->robots) > 0)
|
||||
{
|
||||
foreach ($this->robots as $key => $val)
|
||||
{
|
||||
if (preg_match("|".preg_quote($key)."|i", $this->agent))
|
||||
{
|
||||
$this->is_robot = TRUE;
|
||||
$this->robot = $val;
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Set the Mobile Device
|
||||
*
|
||||
* @access private
|
||||
* @return bool
|
||||
*/
|
||||
function _set_mobile()
|
||||
{
|
||||
if (is_array($this->mobiles) AND count($this->mobiles) > 0)
|
||||
{
|
||||
foreach ($this->mobiles as $key => $val)
|
||||
{
|
||||
if (FALSE !== (strpos(strtolower($this->agent), $key)))
|
||||
{
|
||||
$this->is_mobile = TRUE;
|
||||
$this->mobile = $val;
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Set the accepted languages
|
||||
*
|
||||
* @access private
|
||||
* @return void
|
||||
*/
|
||||
function _set_languages()
|
||||
{
|
||||
if ((count($this->languages) == 0) AND isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) AND $_SERVER['HTTP_ACCEPT_LANGUAGE'] != '')
|
||||
{
|
||||
$languages = preg_replace('/(;q=[0-9\.]+)/i', '', strtolower(trim($_SERVER['HTTP_ACCEPT_LANGUAGE'])));
|
||||
|
||||
$this->languages = explode(',', $languages);
|
||||
}
|
||||
|
||||
if (count($this->languages) == 0)
|
||||
{
|
||||
$this->languages = array('Undefined');
|
||||
}
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Set the accepted character sets
|
||||
*
|
||||
* @access private
|
||||
* @return void
|
||||
*/
|
||||
function _set_charsets()
|
||||
{
|
||||
if ((count($this->charsets) == 0) AND isset($_SERVER['HTTP_ACCEPT_CHARSET']) AND $_SERVER['HTTP_ACCEPT_CHARSET'] != '')
|
||||
{
|
||||
$charsets = preg_replace('/(;q=.+)/i', '', strtolower(trim($_SERVER['HTTP_ACCEPT_CHARSET'])));
|
||||
|
||||
$this->charsets = explode(',', $charsets);
|
||||
}
|
||||
|
||||
if (count($this->charsets) == 0)
|
||||
{
|
||||
$this->charsets = array('Undefined');
|
||||
}
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Is Browser
|
||||
*
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
function is_browser()
|
||||
{
|
||||
return $this->is_browser;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Is Robot
|
||||
*
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
function is_robot()
|
||||
{
|
||||
return $this->is_robot;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Is Mobile
|
||||
*
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
function is_mobile()
|
||||
{
|
||||
return $this->is_mobile;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Is this a referral from another site?
|
||||
*
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
function is_referral()
|
||||
{
|
||||
return ( ! isset($_SERVER['HTTP_REFERER']) OR $_SERVER['HTTP_REFERER'] == '') ? FALSE : TRUE;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Agent String
|
||||
*
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
function agent_string()
|
||||
{
|
||||
return $this->agent;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Get Platform
|
||||
*
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
function platform()
|
||||
{
|
||||
return $this->platform;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Get Browser Name
|
||||
*
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
function browser()
|
||||
{
|
||||
return $this->browser;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Get the Browser Version
|
||||
*
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
function version()
|
||||
{
|
||||
return $this->version;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Get The Robot Name
|
||||
*
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
function robot()
|
||||
{
|
||||
return $this->robot;
|
||||
}
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Get the Mobile Device
|
||||
*
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
function mobile()
|
||||
{
|
||||
return $this->mobile;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Get the referrer
|
||||
*
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
function referrer()
|
||||
{
|
||||
return ( ! isset($_SERVER['HTTP_REFERER']) OR $_SERVER['HTTP_REFERER'] == '') ? '' : trim($_SERVER['HTTP_REFERER']);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Get the accepted languages
|
||||
*
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
function languages()
|
||||
{
|
||||
if (count($this->languages) == 0)
|
||||
{
|
||||
$this->_set_languages();
|
||||
}
|
||||
|
||||
return $this->languages;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Get the accepted Character Sets
|
||||
*
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
function charsets()
|
||||
{
|
||||
if (count($this->charsets) == 0)
|
||||
{
|
||||
$this->_set_charsets();
|
||||
}
|
||||
|
||||
return $this->charsets;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Test for a particular language
|
||||
*
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
function accept_lang($lang = 'en')
|
||||
{
|
||||
return (in_array(strtolower($lang), $this->languages(), TRUE)) ? TRUE : FALSE;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Test for a particular character set
|
||||
*
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
function accept_charset($charset = 'utf-8')
|
||||
{
|
||||
return (in_array(strtolower($charset), $this->charsets(), TRUE)) ? TRUE : FALSE;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* End of file User_agent.php */
|
||||
/* Location: ./system/libraries/User_agent.php */
|
||||
@@ -0,0 +1,875 @@
|
||||
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
/**
|
||||
* CodeIgniter
|
||||
*
|
||||
* An open source application development framework for PHP 4.3.2 or newer
|
||||
*
|
||||
* @package CodeIgniter
|
||||
* @author ExpressionEngine Dev Team
|
||||
* @copyright Copyright (c) 2008 - 2010, EllisLab, Inc.
|
||||
* @license http://codeigniter.com/user_guide/license.html
|
||||
* @link http://codeigniter.com
|
||||
* @since Version 1.0
|
||||
* @filesource
|
||||
*/
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Validation Class
|
||||
*
|
||||
* @package CodeIgniter
|
||||
* @subpackage Libraries
|
||||
* @category Validation
|
||||
* @author ExpressionEngine Dev Team
|
||||
* @link http://codeigniter.com/user_guide/libraries/validation.html
|
||||
*/
|
||||
class CI_Validation {
|
||||
|
||||
var $CI;
|
||||
var $error_string = '';
|
||||
var $_error_array = array();
|
||||
var $_rules = array();
|
||||
var $_fields = array();
|
||||
var $_error_messages = array();
|
||||
var $_current_field = '';
|
||||
var $_safe_form_data = FALSE;
|
||||
var $_error_prefix = '<p>';
|
||||
var $_error_suffix = '</p>';
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
*/
|
||||
function CI_Validation()
|
||||
{
|
||||
$this->CI =& get_instance();
|
||||
|
||||
if (function_exists('mb_internal_encoding'))
|
||||
{
|
||||
mb_internal_encoding($this->CI->config->item('charset'));
|
||||
}
|
||||
|
||||
log_message('debug', "Validation Class Initialized");
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Set Fields
|
||||
*
|
||||
* This function takes an array of field names as input
|
||||
* and generates class variables with the same name, which will
|
||||
* either be blank or contain the $_POST value corresponding to it
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @param string
|
||||
* @return void
|
||||
*/
|
||||
function set_fields($data = '', $field = '')
|
||||
{
|
||||
if ($data == '')
|
||||
{
|
||||
if (count($this->_fields) == 0)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( ! is_array($data))
|
||||
{
|
||||
$data = array($data => $field);
|
||||
}
|
||||
|
||||
if (count($data) > 0)
|
||||
{
|
||||
$this->_fields = $data;
|
||||
}
|
||||
}
|
||||
|
||||
foreach($this->_fields as $key => $val)
|
||||
{
|
||||
$this->$key = ( ! isset($_POST[$key])) ? '' : $this->prep_for_form($_POST[$key]);
|
||||
|
||||
$error = $key.'_error';
|
||||
if ( ! isset($this->$error))
|
||||
{
|
||||
$this->$error = '';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Set Rules
|
||||
*
|
||||
* This function takes an array of field names and validation
|
||||
* rules as input ad simply stores is for use later.
|
||||
*
|
||||
* @access public
|
||||
* @param mixed
|
||||
* @param string
|
||||
* @return void
|
||||
*/
|
||||
function set_rules($data, $rules = '')
|
||||
{
|
||||
if ( ! is_array($data))
|
||||
{
|
||||
if ($rules == '')
|
||||
return;
|
||||
|
||||
$data = array($data => $rules);
|
||||
}
|
||||
|
||||
foreach ($data as $key => $val)
|
||||
{
|
||||
$this->_rules[$key] = $val;
|
||||
}
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Set Error Message
|
||||
*
|
||||
* Lets users set their own error messages on the fly. Note: The key
|
||||
* name has to match the function name that it corresponds to.
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function set_message($lang, $val = '')
|
||||
{
|
||||
if ( ! is_array($lang))
|
||||
{
|
||||
$lang = array($lang => $val);
|
||||
}
|
||||
|
||||
$this->_error_messages = array_merge($this->_error_messages, $lang);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Set The Error Delimiter
|
||||
*
|
||||
* Permits a prefix/suffix to be added to each error message
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @param string
|
||||
* @return void
|
||||
*/
|
||||
function set_error_delimiters($prefix = '<p>', $suffix = '</p>')
|
||||
{
|
||||
$this->_error_prefix = $prefix;
|
||||
$this->_error_suffix = $suffix;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Run the Validator
|
||||
*
|
||||
* This function does all the work.
|
||||
*
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
function run()
|
||||
{
|
||||
// Do we even have any data to process? Mm?
|
||||
if (count($_POST) == 0 OR count($this->_rules) == 0)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// Load the language file containing error messages
|
||||
$this->CI->lang->load('validation');
|
||||
|
||||
// Cycle through the rules and test for errors
|
||||
foreach ($this->_rules as $field => $rules)
|
||||
{
|
||||
//Explode out the rules!
|
||||
$ex = explode('|', $rules);
|
||||
|
||||
// Is the field required? If not, if the field is blank we'll move on to the next test
|
||||
if ( ! in_array('required', $ex, TRUE))
|
||||
{
|
||||
if ( ! isset($_POST[$field]) OR $_POST[$field] == '')
|
||||
{
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Are we dealing with an "isset" rule?
|
||||
*
|
||||
* Before going further, we'll see if one of the rules
|
||||
* is to check whether the item is set (typically this
|
||||
* applies only to checkboxes). If so, we'll
|
||||
* test for it here since there's not reason to go
|
||||
* further
|
||||
*/
|
||||
if ( ! isset($_POST[$field]))
|
||||
{
|
||||
if (in_array('isset', $ex, TRUE) OR in_array('required', $ex))
|
||||
{
|
||||
if ( ! isset($this->_error_messages['isset']))
|
||||
{
|
||||
if (FALSE === ($line = $this->CI->lang->line('isset')))
|
||||
{
|
||||
$line = 'The field was not set';
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$line = $this->_error_messages['isset'];
|
||||
}
|
||||
|
||||
// Build the error message
|
||||
$mfield = ( ! isset($this->_fields[$field])) ? $field : $this->_fields[$field];
|
||||
$message = sprintf($line, $mfield);
|
||||
|
||||
// Set the error variable. Example: $this->username_error
|
||||
$error = $field.'_error';
|
||||
$this->$error = $this->_error_prefix.$message.$this->_error_suffix;
|
||||
$this->_error_array[] = $message;
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
/*
|
||||
* Set the current field
|
||||
*
|
||||
* The various prepping functions need to know the
|
||||
* current field name so they can do this:
|
||||
*
|
||||
* $_POST[$this->_current_field] == 'bla bla';
|
||||
*/
|
||||
$this->_current_field = $field;
|
||||
|
||||
// Cycle through the rules!
|
||||
foreach ($ex As $rule)
|
||||
{
|
||||
// Is the rule a callback?
|
||||
$callback = FALSE;
|
||||
if (substr($rule, 0, 9) == 'callback_')
|
||||
{
|
||||
$rule = substr($rule, 9);
|
||||
$callback = TRUE;
|
||||
}
|
||||
|
||||
// Strip the parameter (if exists) from the rule
|
||||
// Rules can contain a parameter: max_length[5]
|
||||
$param = FALSE;
|
||||
if (preg_match("/(.*?)\[(.*?)\]/", $rule, $match))
|
||||
{
|
||||
$rule = $match[1];
|
||||
$param = $match[2];
|
||||
}
|
||||
|
||||
// Call the function that corresponds to the rule
|
||||
if ($callback === TRUE)
|
||||
{
|
||||
if ( ! method_exists($this->CI, $rule))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
$result = $this->CI->$rule($_POST[$field], $param);
|
||||
|
||||
// If the field isn't required and we just processed a callback we'll move on...
|
||||
if ( ! in_array('required', $ex, TRUE) AND $result !== FALSE)
|
||||
{
|
||||
continue 2;
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( ! method_exists($this, $rule))
|
||||
{
|
||||
/*
|
||||
* Run the native PHP function if called for
|
||||
*
|
||||
* If our own wrapper function doesn't exist we see
|
||||
* if a native PHP function does. Users can use
|
||||
* any native PHP function call that has one param.
|
||||
*/
|
||||
if (function_exists($rule))
|
||||
{
|
||||
$_POST[$field] = $rule($_POST[$field]);
|
||||
$this->$field = $_POST[$field];
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
$result = $this->$rule($_POST[$field], $param);
|
||||
}
|
||||
|
||||
// Did the rule test negatively? If so, grab the error.
|
||||
if ($result === FALSE)
|
||||
{
|
||||
if ( ! isset($this->_error_messages[$rule]))
|
||||
{
|
||||
if (FALSE === ($line = $this->CI->lang->line($rule)))
|
||||
{
|
||||
$line = 'Unable to access an error message corresponding to your field name.';
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$line = $this->_error_messages[$rule];
|
||||
}
|
||||
|
||||
// Build the error message
|
||||
$mfield = ( ! isset($this->_fields[$field])) ? $field : $this->_fields[$field];
|
||||
$mparam = ( ! isset($this->_fields[$param])) ? $param : $this->_fields[$param];
|
||||
$message = sprintf($line, $mfield, $mparam);
|
||||
|
||||
// Set the error variable. Example: $this->username_error
|
||||
$error = $field.'_error';
|
||||
$this->$error = $this->_error_prefix.$message.$this->_error_suffix;
|
||||
|
||||
// Add the error to the error array
|
||||
$this->_error_array[] = $message;
|
||||
continue 2;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
$total_errors = count($this->_error_array);
|
||||
|
||||
/*
|
||||
* Recompile the class variables
|
||||
*
|
||||
* If any prepping functions were called the $_POST data
|
||||
* might now be different then the corresponding class
|
||||
* variables so we'll set them anew.
|
||||
*/
|
||||
if ($total_errors > 0)
|
||||
{
|
||||
$this->_safe_form_data = TRUE;
|
||||
}
|
||||
|
||||
$this->set_fields();
|
||||
|
||||
// Did we end up with any errors?
|
||||
if ($total_errors == 0)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// Generate the error string
|
||||
foreach ($this->_error_array as $val)
|
||||
{
|
||||
$this->error_string .= $this->_error_prefix.$val.$this->_error_suffix."\n";
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Required
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @return bool
|
||||
*/
|
||||
function required($str)
|
||||
{
|
||||
if ( ! is_array($str))
|
||||
{
|
||||
return (trim($str) == '') ? FALSE : TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
return ( ! empty($str));
|
||||
}
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Match one field to another
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @param field
|
||||
* @return bool
|
||||
*/
|
||||
function matches($str, $field)
|
||||
{
|
||||
if ( ! isset($_POST[$field]))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return ($str !== $_POST[$field]) ? FALSE : TRUE;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Minimum Length
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @param value
|
||||
* @return bool
|
||||
*/
|
||||
function min_length($str, $val)
|
||||
{
|
||||
if (preg_match("/[^0-9]/", $val))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (function_exists('mb_strlen'))
|
||||
{
|
||||
return (mb_strlen($str) < $val) ? FALSE : TRUE;
|
||||
}
|
||||
|
||||
return (strlen($str) < $val) ? FALSE : TRUE;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Max Length
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @param value
|
||||
* @return bool
|
||||
*/
|
||||
function max_length($str, $val)
|
||||
{
|
||||
if (preg_match("/[^0-9]/", $val))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (function_exists('mb_strlen'))
|
||||
{
|
||||
return (mb_strlen($str) > $val) ? FALSE : TRUE;
|
||||
}
|
||||
|
||||
return (strlen($str) > $val) ? FALSE : TRUE;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Exact Length
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @param value
|
||||
* @return bool
|
||||
*/
|
||||
function exact_length($str, $val)
|
||||
{
|
||||
if (preg_match("/[^0-9]/", $val))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (function_exists('mb_strlen'))
|
||||
{
|
||||
return (mb_strlen($str) != $val) ? FALSE : TRUE;
|
||||
}
|
||||
|
||||
return (strlen($str) != $val) ? FALSE : TRUE;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Valid Email
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @return bool
|
||||
*/
|
||||
function valid_email($str)
|
||||
{
|
||||
return ( ! preg_match("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix", $str)) ? FALSE : TRUE;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Valid Emails
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @return bool
|
||||
*/
|
||||
function valid_emails($str)
|
||||
{
|
||||
if (strpos($str, ',') === FALSE)
|
||||
{
|
||||
return $this->valid_email(trim($str));
|
||||
}
|
||||
|
||||
foreach(explode(',', $str) as $email)
|
||||
{
|
||||
if (trim($email) != '' && $this->valid_email(trim($email)) === FALSE)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Validate IP Address
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function valid_ip($ip)
|
||||
{
|
||||
return $this->CI->input->valid_ip($ip);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Alpha
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @return bool
|
||||
*/
|
||||
function alpha($str)
|
||||
{
|
||||
return ( ! preg_match("/^([a-z])+$/i", $str)) ? FALSE : TRUE;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Alpha-numeric
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @return bool
|
||||
*/
|
||||
function alpha_numeric($str)
|
||||
{
|
||||
return ( ! preg_match("/^([a-z0-9])+$/i", $str)) ? FALSE : TRUE;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Alpha-numeric with underscores and dashes
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @return bool
|
||||
*/
|
||||
function alpha_dash($str)
|
||||
{
|
||||
return ( ! preg_match("/^([-a-z0-9_-])+$/i", $str)) ? FALSE : TRUE;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Numeric
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @return bool
|
||||
*/
|
||||
function numeric($str)
|
||||
{
|
||||
return (bool)preg_match( '/^[\-+]?[0-9]*\.?[0-9]+$/', $str);
|
||||
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Is Numeric
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @return bool
|
||||
*/
|
||||
function is_numeric($str)
|
||||
{
|
||||
return ( ! is_numeric($str)) ? FALSE : TRUE;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Integer
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @return bool
|
||||
*/
|
||||
function integer($str)
|
||||
{
|
||||
return (bool)preg_match( '/^[\-+]?[0-9]+$/', $str);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Is a Natural number (0,1,2,3, etc.)
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @return bool
|
||||
*/
|
||||
function is_natural($str)
|
||||
{
|
||||
return (bool)preg_match( '/^[0-9]+$/', $str);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Is a Natural number, but not a zero (1,2,3, etc.)
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @return bool
|
||||
*/
|
||||
function is_natural_no_zero($str)
|
||||
{
|
||||
if ( ! preg_match( '/^[0-9]+$/', $str))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if ($str == 0)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Valid Base64
|
||||
*
|
||||
* Tests a string for characters outside of the Base64 alphabet
|
||||
* as defined by RFC 2045 http://www.faqs.org/rfcs/rfc2045
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @return bool
|
||||
*/
|
||||
function valid_base64($str)
|
||||
{
|
||||
return (bool) ! preg_match('/[^a-zA-Z0-9\/\+=]/', $str);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Set Select
|
||||
*
|
||||
* Enables pull-down lists to be set to the value the user
|
||||
* selected in the event of an error
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function set_select($field = '', $value = '')
|
||||
{
|
||||
if ($field == '' OR $value == '' OR ! isset($_POST[$field]))
|
||||
{
|
||||
return '';
|
||||
}
|
||||
|
||||
if ($_POST[$field] == $value)
|
||||
{
|
||||
return ' selected="selected"';
|
||||
}
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Set Radio
|
||||
*
|
||||
* Enables radio buttons to be set to the value the user
|
||||
* selected in the event of an error
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function set_radio($field = '', $value = '')
|
||||
{
|
||||
if ($field == '' OR $value == '' OR ! isset($_POST[$field]))
|
||||
{
|
||||
return '';
|
||||
}
|
||||
|
||||
if ($_POST[$field] == $value)
|
||||
{
|
||||
return ' checked="checked"';
|
||||
}
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Set Checkbox
|
||||
*
|
||||
* Enables checkboxes to be set to the value the user
|
||||
* selected in the event of an error
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function set_checkbox($field = '', $value = '')
|
||||
{
|
||||
if ($field == '' OR $value == '' OR ! isset($_POST[$field]))
|
||||
{
|
||||
return '';
|
||||
}
|
||||
|
||||
if ($_POST[$field] == $value)
|
||||
{
|
||||
return ' checked="checked"';
|
||||
}
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Prep data for form
|
||||
*
|
||||
* This function allows HTML to be safely shown in a form.
|
||||
* Special characters are converted.
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function prep_for_form($data = '')
|
||||
{
|
||||
if (is_array($data))
|
||||
{
|
||||
foreach ($data as $key => $val)
|
||||
{
|
||||
$data[$key] = $this->prep_for_form($val);
|
||||
}
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
if ($this->_safe_form_data == FALSE OR $data == '')
|
||||
{
|
||||
return $data;
|
||||
}
|
||||
|
||||
return str_replace(array("'", '"', '<', '>'), array("'", """, '<', '>'), stripslashes($data));
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Prep URL
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function prep_url($str = '')
|
||||
{
|
||||
if ($str == 'http://' OR $str == '')
|
||||
{
|
||||
$_POST[$this->_current_field] = '';
|
||||
return;
|
||||
}
|
||||
|
||||
if (substr($str, 0, 7) != 'http://' && substr($str, 0, 8) != 'https://')
|
||||
{
|
||||
$str = 'http://'.$str;
|
||||
}
|
||||
|
||||
$_POST[$this->_current_field] = $str;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Strip Image Tags
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function strip_image_tags($str)
|
||||
{
|
||||
$_POST[$this->_current_field] = $this->CI->input->strip_image_tags($str);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* XSS Clean
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function xss_clean($str)
|
||||
{
|
||||
$_POST[$this->_current_field] = $this->CI->input->xss_clean($str);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Convert PHP tags to entities
|
||||
*
|
||||
* @access public
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function encode_php_tags($str)
|
||||
{
|
||||
$_POST[$this->_current_field] = str_replace(array('<?php', '<?PHP', '<?', '?>'), array('<?php', '<?PHP', '<?', '?>'), $str);
|
||||
}
|
||||
|
||||
}
|
||||
// END Validation Class
|
||||
|
||||
/* End of file Validation.php */
|
||||
/* Location: ./system/libraries/Validation.php */
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,536 @@
|
||||
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
/**
|
||||
* CodeIgniter
|
||||
*
|
||||
* An open source application development framework for PHP 4.3.2 or newer
|
||||
*
|
||||
* @package CodeIgniter
|
||||
* @author ExpressionEngine Dev Team
|
||||
* @copyright Copyright (c) 2008 - 2010, EllisLab, Inc.
|
||||
* @license http://codeigniter.com/user_guide/license.html
|
||||
* @link http://codeigniter.com
|
||||
* @since Version 1.0
|
||||
* @filesource
|
||||
*/
|
||||
|
||||
if ( ! function_exists('xml_parser_create'))
|
||||
{
|
||||
show_error('Your PHP installation does not support XML');
|
||||
}
|
||||
|
||||
if ( ! class_exists('CI_Xmlrpc'))
|
||||
{
|
||||
show_error('You must load the Xmlrpc class before loading the Xmlrpcs class in order to create a server.');
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* XML-RPC server class
|
||||
*
|
||||
* @package CodeIgniter
|
||||
* @subpackage Libraries
|
||||
* @category XML-RPC
|
||||
* @author ExpressionEngine Dev Team
|
||||
* @link http://codeigniter.com/user_guide/libraries/xmlrpc.html
|
||||
*/
|
||||
class CI_Xmlrpcs extends CI_Xmlrpc
|
||||
{
|
||||
var $methods = array(); //array of methods mapped to function names and signatures
|
||||
var $debug_msg = ''; // Debug Message
|
||||
var $system_methods = array(); // XML RPC Server methods
|
||||
var $controller_obj;
|
||||
|
||||
var $object = FALSE;
|
||||
|
||||
|
||||
//-------------------------------------
|
||||
// Constructor, more or less
|
||||
//-------------------------------------
|
||||
|
||||
function CI_Xmlrpcs($config=array())
|
||||
{
|
||||
parent::CI_Xmlrpc();
|
||||
$this->set_system_methods();
|
||||
|
||||
if (isset($config['functions']) && is_array($config['functions']))
|
||||
{
|
||||
$this->methods = array_merge($this->methods, $config['functions']);
|
||||
}
|
||||
|
||||
log_message('debug', "XML-RPC Server Class Initialized");
|
||||
}
|
||||
|
||||
//-------------------------------------
|
||||
// Initialize Prefs and Serve
|
||||
//-------------------------------------
|
||||
|
||||
function initialize($config=array())
|
||||
{
|
||||
if (isset($config['functions']) && is_array($config['functions']))
|
||||
{
|
||||
$this->methods = array_merge($this->methods, $config['functions']);
|
||||
}
|
||||
|
||||
if (isset($config['debug']))
|
||||
{
|
||||
$this->debug = $config['debug'];
|
||||
}
|
||||
|
||||
if (isset($config['object']) && is_object($config['object']))
|
||||
{
|
||||
$this->object = $config['object'];
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------------------
|
||||
// Setting of System Methods
|
||||
//-------------------------------------
|
||||
|
||||
function set_system_methods ()
|
||||
{
|
||||
$this->methods = array(
|
||||
'system.listMethods' => array(
|
||||
'function' => 'this.listMethods',
|
||||
'signature' => array(array($this->xmlrpcArray, $this->xmlrpcString), array($this->xmlrpcArray)),
|
||||
'docstring' => 'Returns an array of available methods on this server'),
|
||||
'system.methodHelp' => array(
|
||||
'function' => 'this.methodHelp',
|
||||
'signature' => array(array($this->xmlrpcString, $this->xmlrpcString)),
|
||||
'docstring' => 'Returns a documentation string for the specified method'),
|
||||
'system.methodSignature' => array(
|
||||
'function' => 'this.methodSignature',
|
||||
'signature' => array(array($this->xmlrpcArray, $this->xmlrpcString)),
|
||||
'docstring' => 'Returns an array describing the return type and required parameters of a method'),
|
||||
'system.multicall' => array(
|
||||
'function' => 'this.multicall',
|
||||
'signature' => array(array($this->xmlrpcArray, $this->xmlrpcArray)),
|
||||
'docstring' => 'Combine multiple RPC calls in one request. See http://www.xmlrpc.com/discuss/msgReader$1208 for details')
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------
|
||||
// Main Server Function
|
||||
//-------------------------------------
|
||||
|
||||
function serve()
|
||||
{
|
||||
$r = $this->parseRequest();
|
||||
$payload = '<?xml version="1.0" encoding="'.$this->xmlrpc_defencoding.'"?'.'>'."\n";
|
||||
$payload .= $this->debug_msg;
|
||||
$payload .= $r->prepare_response();
|
||||
|
||||
header("Content-Type: text/xml");
|
||||
header("Content-Length: ".strlen($payload));
|
||||
exit($payload);
|
||||
}
|
||||
|
||||
//-------------------------------------
|
||||
// Add Method to Class
|
||||
//-------------------------------------
|
||||
|
||||
function add_to_map($methodname,$function,$sig,$doc)
|
||||
{
|
||||
$this->methods[$methodname] = array(
|
||||
'function' => $function,
|
||||
'signature' => $sig,
|
||||
'docstring' => $doc
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------
|
||||
// Parse Server Request
|
||||
//-------------------------------------
|
||||
|
||||
function parseRequest($data='')
|
||||
{
|
||||
global $HTTP_RAW_POST_DATA;
|
||||
|
||||
//-------------------------------------
|
||||
// Get Data
|
||||
//-------------------------------------
|
||||
|
||||
if ($data == '')
|
||||
{
|
||||
$data = $HTTP_RAW_POST_DATA;
|
||||
}
|
||||
|
||||
//-------------------------------------
|
||||
// Set up XML Parser
|
||||
//-------------------------------------
|
||||
|
||||
$parser = xml_parser_create($this->xmlrpc_defencoding);
|
||||
$parser_object = new XML_RPC_Message("filler");
|
||||
|
||||
$parser_object->xh[$parser] = array();
|
||||
$parser_object->xh[$parser]['isf'] = 0;
|
||||
$parser_object->xh[$parser]['isf_reason'] = '';
|
||||
$parser_object->xh[$parser]['params'] = array();
|
||||
$parser_object->xh[$parser]['stack'] = array();
|
||||
$parser_object->xh[$parser]['valuestack'] = array();
|
||||
$parser_object->xh[$parser]['method'] = '';
|
||||
|
||||
xml_set_object($parser, $parser_object);
|
||||
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, true);
|
||||
xml_set_element_handler($parser, 'open_tag', 'closing_tag');
|
||||
xml_set_character_data_handler($parser, 'character_data');
|
||||
//xml_set_default_handler($parser, 'default_handler');
|
||||
|
||||
|
||||
//-------------------------------------
|
||||
// PARSE + PROCESS XML DATA
|
||||
//-------------------------------------
|
||||
|
||||
if ( ! xml_parse($parser, $data, 1))
|
||||
{
|
||||
// return XML error as a faultCode
|
||||
$r = new XML_RPC_Response(0,
|
||||
$this->xmlrpcerrxml + xml_get_error_code($parser),
|
||||
sprintf('XML error: %s at line %d',
|
||||
xml_error_string(xml_get_error_code($parser)),
|
||||
xml_get_current_line_number($parser)));
|
||||
xml_parser_free($parser);
|
||||
}
|
||||
elseif($parser_object->xh[$parser]['isf'])
|
||||
{
|
||||
return new XML_RPC_Response(0, $this->xmlrpcerr['invalid_return'], $this->xmlrpcstr['invalid_return']);
|
||||
}
|
||||
else
|
||||
{
|
||||
xml_parser_free($parser);
|
||||
|
||||
$m = new XML_RPC_Message($parser_object->xh[$parser]['method']);
|
||||
$plist='';
|
||||
|
||||
for($i=0; $i < count($parser_object->xh[$parser]['params']); $i++)
|
||||
{
|
||||
if ($this->debug === TRUE)
|
||||
{
|
||||
$plist .= "$i - " . print_r(get_object_vars($parser_object->xh[$parser]['params'][$i]), TRUE). ";\n";
|
||||
}
|
||||
|
||||
$m->addParam($parser_object->xh[$parser]['params'][$i]);
|
||||
}
|
||||
|
||||
if ($this->debug === TRUE)
|
||||
{
|
||||
echo "<pre>";
|
||||
echo "---PLIST---\n" . $plist . "\n---PLIST END---\n\n";
|
||||
echo "</pre>";
|
||||
}
|
||||
|
||||
$r = $this->_execute($m);
|
||||
}
|
||||
|
||||
//-------------------------------------
|
||||
// SET DEBUGGING MESSAGE
|
||||
//-------------------------------------
|
||||
|
||||
if ($this->debug === TRUE)
|
||||
{
|
||||
$this->debug_msg = "<!-- DEBUG INFO:\n\n".$plist."\n END DEBUG-->\n";
|
||||
}
|
||||
|
||||
return $r;
|
||||
}
|
||||
|
||||
//-------------------------------------
|
||||
// Executes the Method
|
||||
//-------------------------------------
|
||||
|
||||
function _execute($m)
|
||||
{
|
||||
$methName = $m->method_name;
|
||||
|
||||
// Check to see if it is a system call
|
||||
$system_call = (strncmp($methName, 'system', 5) == 0) ? TRUE : FALSE;
|
||||
|
||||
//-------------------------------------
|
||||
// Valid Method
|
||||
//-------------------------------------
|
||||
|
||||
if ( ! isset($this->methods[$methName]['function']))
|
||||
{
|
||||
return new XML_RPC_Response(0, $this->xmlrpcerr['unknown_method'], $this->xmlrpcstr['unknown_method']);
|
||||
}
|
||||
|
||||
//-------------------------------------
|
||||
// Check for Method (and Object)
|
||||
//-------------------------------------
|
||||
|
||||
$method_parts = explode(".", $this->methods[$methName]['function']);
|
||||
$objectCall = (isset($method_parts['1']) && $method_parts['1'] != "") ? TRUE : FALSE;
|
||||
|
||||
if ($system_call === TRUE)
|
||||
{
|
||||
if ( ! is_callable(array($this,$method_parts['1'])))
|
||||
{
|
||||
return new XML_RPC_Response(0, $this->xmlrpcerr['unknown_method'], $this->xmlrpcstr['unknown_method']);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ($objectCall && ! is_callable(array($method_parts['0'],$method_parts['1'])))
|
||||
{
|
||||
return new XML_RPC_Response(0, $this->xmlrpcerr['unknown_method'], $this->xmlrpcstr['unknown_method']);
|
||||
}
|
||||
elseif ( ! $objectCall && ! is_callable($this->methods[$methName]['function']))
|
||||
{
|
||||
return new XML_RPC_Response(0, $this->xmlrpcerr['unknown_method'], $this->xmlrpcstr['unknown_method']);
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------------------
|
||||
// Checking Methods Signature
|
||||
//-------------------------------------
|
||||
|
||||
if (isset($this->methods[$methName]['signature']))
|
||||
{
|
||||
$sig = $this->methods[$methName]['signature'];
|
||||
for($i=0; $i<count($sig); $i++)
|
||||
{
|
||||
$current_sig = $sig[$i];
|
||||
|
||||
if (count($current_sig) == count($m->params)+1)
|
||||
{
|
||||
for($n=0; $n < count($m->params); $n++)
|
||||
{
|
||||
$p = $m->params[$n];
|
||||
$pt = ($p->kindOf() == 'scalar') ? $p->scalarval() : $p->kindOf();
|
||||
|
||||
if ($pt != $current_sig[$n+1])
|
||||
{
|
||||
$pno = $n+1;
|
||||
$wanted = $current_sig[$n+1];
|
||||
|
||||
return new XML_RPC_Response(0,
|
||||
$this->xmlrpcerr['incorrect_params'],
|
||||
$this->xmlrpcstr['incorrect_params'] .
|
||||
": Wanted {$wanted}, got {$pt} at param {$pno})");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------------------
|
||||
// Calls the Function
|
||||
//-------------------------------------
|
||||
|
||||
if ($objectCall === TRUE)
|
||||
{
|
||||
if ($method_parts[0] == "this" && $system_call == TRUE)
|
||||
{
|
||||
return call_user_func(array($this, $method_parts[1]), $m);
|
||||
}
|
||||
else
|
||||
{
|
||||
if ($this->object === FALSE)
|
||||
{
|
||||
$CI =& get_instance();
|
||||
return $CI->$method_parts['1']($m);
|
||||
}
|
||||
else
|
||||
{
|
||||
return $this->object->$method_parts['1']($m);
|
||||
//return call_user_func(array(&$method_parts['0'],$method_parts['1']), $m);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return call_user_func($this->methods[$methName]['function'], $m);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------
|
||||
// Server Function: List Methods
|
||||
//-------------------------------------
|
||||
|
||||
function listMethods($m)
|
||||
{
|
||||
$v = new XML_RPC_Values();
|
||||
$output = array();
|
||||
|
||||
foreach($this->methods as $key => $value)
|
||||
{
|
||||
$output[] = new XML_RPC_Values($key, 'string');
|
||||
}
|
||||
|
||||
foreach($this->system_methods as $key => $value)
|
||||
{
|
||||
$output[]= new XML_RPC_Values($key, 'string');
|
||||
}
|
||||
|
||||
$v->addArray($output);
|
||||
return new XML_RPC_Response($v);
|
||||
}
|
||||
|
||||
//-------------------------------------
|
||||
// Server Function: Return Signature for Method
|
||||
//-------------------------------------
|
||||
|
||||
function methodSignature($m)
|
||||
{
|
||||
$parameters = $m->output_parameters();
|
||||
$method_name = $parameters[0];
|
||||
|
||||
if (isset($this->methods[$method_name]))
|
||||
{
|
||||
if ($this->methods[$method_name]['signature'])
|
||||
{
|
||||
$sigs = array();
|
||||
$signature = $this->methods[$method_name]['signature'];
|
||||
|
||||
for($i=0; $i < count($signature); $i++)
|
||||
{
|
||||
$cursig = array();
|
||||
$inSig = $signature[$i];
|
||||
for($j=0; $j<count($inSig); $j++)
|
||||
{
|
||||
$cursig[]= new XML_RPC_Values($inSig[$j], 'string');
|
||||
}
|
||||
$sigs[]= new XML_RPC_Values($cursig, 'array');
|
||||
}
|
||||
$r = new XML_RPC_Response(new XML_RPC_Values($sigs, 'array'));
|
||||
}
|
||||
else
|
||||
{
|
||||
$r = new XML_RPC_Response(new XML_RPC_Values('undef', 'string'));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$r = new XML_RPC_Response(0,$this->xmlrpcerr['introspect_unknown'], $this->xmlrpcstr['introspect_unknown']);
|
||||
}
|
||||
return $r;
|
||||
}
|
||||
|
||||
//-------------------------------------
|
||||
// Server Function: Doc String for Method
|
||||
//-------------------------------------
|
||||
|
||||
function methodHelp($m)
|
||||
{
|
||||
$parameters = $m->output_parameters();
|
||||
$method_name = $parameters[0];
|
||||
|
||||
if (isset($this->methods[$method_name]))
|
||||
{
|
||||
$docstring = isset($this->methods[$method_name]['docstring']) ? $this->methods[$method_name]['docstring'] : '';
|
||||
|
||||
return new XML_RPC_Response(new XML_RPC_Values($docstring, 'string'));
|
||||
}
|
||||
else
|
||||
{
|
||||
return new XML_RPC_Response(0, $this->xmlrpcerr['introspect_unknown'], $this->xmlrpcstr['introspect_unknown']);
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------------------
|
||||
// Server Function: Multi-call
|
||||
//-------------------------------------
|
||||
|
||||
function multicall($m)
|
||||
{
|
||||
// Disabled
|
||||
return new XML_RPC_Response(0, $this->xmlrpcerr['unknown_method'], $this->xmlrpcstr['unknown_method']);
|
||||
|
||||
$parameters = $m->output_parameters();
|
||||
$calls = $parameters[0];
|
||||
|
||||
$result = array();
|
||||
|
||||
foreach ($calls as $value)
|
||||
{
|
||||
//$attempt = $this->_execute(new XML_RPC_Message($value[0], $value[1]));
|
||||
|
||||
$m = new XML_RPC_Message($value[0]);
|
||||
$plist='';
|
||||
|
||||
for($i=0; $i < count($value[1]); $i++)
|
||||
{
|
||||
$m->addParam(new XML_RPC_Values($value[1][$i], 'string'));
|
||||
}
|
||||
|
||||
$attempt = $this->_execute($m);
|
||||
|
||||
if ($attempt->faultCode() != 0)
|
||||
{
|
||||
return $attempt;
|
||||
}
|
||||
|
||||
$result[] = new XML_RPC_Values(array($attempt->value()), 'array');
|
||||
}
|
||||
|
||||
return new XML_RPC_Response(new XML_RPC_Values($result, 'array'));
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------
|
||||
// Multi-call Function: Error Handling
|
||||
//-------------------------------------
|
||||
|
||||
function multicall_error($err)
|
||||
{
|
||||
$str = is_string($err) ? $this->xmlrpcstr["multicall_${err}"] : $err->faultString();
|
||||
$code = is_string($err) ? $this->xmlrpcerr["multicall_${err}"] : $err->faultCode();
|
||||
|
||||
$struct['faultCode'] = new XML_RPC_Values($code, 'int');
|
||||
$struct['faultString'] = new XML_RPC_Values($str, 'string');
|
||||
|
||||
return new XML_RPC_Values($struct, 'struct');
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------
|
||||
// Multi-call Function: Processes method
|
||||
//-------------------------------------
|
||||
|
||||
function do_multicall($call)
|
||||
{
|
||||
if ($call->kindOf() != 'struct')
|
||||
return $this->multicall_error('notstruct');
|
||||
elseif ( ! $methName = $call->me['struct']['methodName'])
|
||||
return $this->multicall_error('nomethod');
|
||||
|
||||
list($scalar_type,$scalar_value)=each($methName->me);
|
||||
$scalar_type = $scalar_type == $this->xmlrpcI4 ? $this->xmlrpcInt : $scalar_type;
|
||||
|
||||
if ($methName->kindOf() != 'scalar' OR $scalar_type != 'string')
|
||||
return $this->multicall_error('notstring');
|
||||
elseif ($scalar_value == 'system.multicall')
|
||||
return $this->multicall_error('recursion');
|
||||
elseif ( ! $params = $call->me['struct']['params'])
|
||||
return $this->multicall_error('noparams');
|
||||
elseif ($params->kindOf() != 'array')
|
||||
return $this->multicall_error('notarray');
|
||||
|
||||
list($a,$b)=each($params->me);
|
||||
$numParams = count($b);
|
||||
|
||||
$msg = new XML_RPC_Message($scalar_value);
|
||||
for ($i = 0; $i < $numParams; $i++)
|
||||
{
|
||||
$msg->params[] = $params->me['array'][$i];
|
||||
}
|
||||
|
||||
$result = $this->_execute($msg);
|
||||
|
||||
if ($result->faultCode() != 0)
|
||||
{
|
||||
return $this->multicall_error($result);
|
||||
}
|
||||
|
||||
return new XML_RPC_Values(array($result->value()), 'array');
|
||||
}
|
||||
|
||||
}
|
||||
// END XML_RPC_Server class
|
||||
|
||||
|
||||
/* End of file Xmlrpcs.php */
|
||||
/* Location: ./system/libraries/Xmlrpcs.php */
|
||||
@@ -0,0 +1,359 @@
|
||||
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
/**
|
||||
* CodeIgniter
|
||||
*
|
||||
* An open source application development framework for PHP 4.3.2 or newer
|
||||
*
|
||||
* @package CodeIgniter
|
||||
* @author ExpressionEngine Dev Team
|
||||
* @copyright Copyright (c) 2008 - 2010, EllisLab, Inc.
|
||||
* @license http://codeigniter.com/user_guide/license.html
|
||||
* @link http://codeigniter.com
|
||||
* @since Version 1.0
|
||||
* @filesource
|
||||
*/
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Zip Compression Class
|
||||
*
|
||||
* This class is based on a library I found at Zend:
|
||||
* http://www.zend.com/codex.php?id=696&single=1
|
||||
*
|
||||
* The original library is a little rough around the edges so I
|
||||
* refactored it and added several additional methods -- Rick Ellis
|
||||
*
|
||||
* @package CodeIgniter
|
||||
* @subpackage Libraries
|
||||
* @category Encryption
|
||||
* @author ExpressionEngine Dev Team
|
||||
* @link http://codeigniter.com/user_guide/libraries/zip.html
|
||||
*/
|
||||
class CI_Zip {
|
||||
|
||||
var $zipdata = '';
|
||||
var $directory = '';
|
||||
var $entries = 0;
|
||||
var $file_num = 0;
|
||||
var $offset = 0;
|
||||
|
||||
function CI_Zip()
|
||||
{
|
||||
log_message('debug', "Zip Compression Class Initialized");
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Add Directory
|
||||
*
|
||||
* Lets you add a virtual directory into which you can place files.
|
||||
*
|
||||
* @access public
|
||||
* @param mixed the directory name. Can be string or array
|
||||
* @return void
|
||||
*/
|
||||
function add_dir($directory)
|
||||
{
|
||||
foreach ((array)$directory as $dir)
|
||||
{
|
||||
if ( ! preg_match("|.+/$|", $dir))
|
||||
{
|
||||
$dir .= '/';
|
||||
}
|
||||
|
||||
$this->_add_dir($dir);
|
||||
}
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Add Directory
|
||||
*
|
||||
* @access private
|
||||
* @param string the directory name
|
||||
* @return void
|
||||
*/
|
||||
function _add_dir($dir)
|
||||
{
|
||||
$dir = str_replace("\\", "/", $dir);
|
||||
|
||||
$this->zipdata .=
|
||||
"\x50\x4b\x03\x04\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||
.pack('V', 0) // crc32
|
||||
.pack('V', 0) // compressed filesize
|
||||
.pack('V', 0) // uncompressed filesize
|
||||
.pack('v', strlen($dir)) // length of pathname
|
||||
.pack('v', 0) // extra field length
|
||||
.$dir
|
||||
// below is "data descriptor" segment
|
||||
.pack('V', 0) // crc32
|
||||
.pack('V', 0) // compressed filesize
|
||||
.pack('V', 0); // uncompressed filesize
|
||||
|
||||
$this->directory .=
|
||||
"\x50\x4b\x01\x02\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||
.pack('V',0) // crc32
|
||||
.pack('V',0) // compressed filesize
|
||||
.pack('V',0) // uncompressed filesize
|
||||
.pack('v', strlen($dir)) // length of pathname
|
||||
.pack('v', 0) // extra field length
|
||||
.pack('v', 0) // file comment length
|
||||
.pack('v', 0) // disk number start
|
||||
.pack('v', 0) // internal file attributes
|
||||
.pack('V', 16) // external file attributes - 'directory' bit set
|
||||
.pack('V', $this->offset) // relative offset of local header
|
||||
.$dir;
|
||||
|
||||
$this->offset = strlen($this->zipdata);
|
||||
$this->entries++;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Add Data to Zip
|
||||
*
|
||||
* Lets you add files to the archive. If the path is included
|
||||
* in the filename it will be placed within a directory. Make
|
||||
* sure you use add_dir() first to create the folder.
|
||||
*
|
||||
* @access public
|
||||
* @param mixed
|
||||
* @param string
|
||||
* @return void
|
||||
*/
|
||||
function add_data($filepath, $data = NULL)
|
||||
{
|
||||
if (is_array($filepath))
|
||||
{
|
||||
foreach ($filepath as $path => $data)
|
||||
{
|
||||
$this->_add_data($path, $data);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->_add_data($filepath, $data);
|
||||
}
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Add Data to Zip
|
||||
*
|
||||
* @access private
|
||||
* @param string the file name/path
|
||||
* @param string the data to be encoded
|
||||
* @return void
|
||||
*/
|
||||
function _add_data($filepath, $data)
|
||||
{
|
||||
$filepath = str_replace("\\", "/", $filepath);
|
||||
|
||||
$uncompressed_size = strlen($data);
|
||||
$crc32 = crc32($data);
|
||||
|
||||
$gzdata = gzcompress($data);
|
||||
$gzdata = substr($gzdata, 2, -4);
|
||||
$compressed_size = strlen($gzdata);
|
||||
|
||||
$this->zipdata .=
|
||||
"\x50\x4b\x03\x04\x14\x00\x00\x00\x08\x00\x00\x00\x00\x00"
|
||||
.pack('V', $crc32)
|
||||
.pack('V', $compressed_size)
|
||||
.pack('V', $uncompressed_size)
|
||||
.pack('v', strlen($filepath)) // length of filename
|
||||
.pack('v', 0) // extra field length
|
||||
.$filepath
|
||||
.$gzdata; // "file data" segment
|
||||
|
||||
$this->directory .=
|
||||
"\x50\x4b\x01\x02\x00\x00\x14\x00\x00\x00\x08\x00\x00\x00\x00\x00"
|
||||
.pack('V', $crc32)
|
||||
.pack('V', $compressed_size)
|
||||
.pack('V', $uncompressed_size)
|
||||
.pack('v', strlen($filepath)) // length of filename
|
||||
.pack('v', 0) // extra field length
|
||||
.pack('v', 0) // file comment length
|
||||
.pack('v', 0) // disk number start
|
||||
.pack('v', 0) // internal file attributes
|
||||
.pack('V', 32) // external file attributes - 'archive' bit set
|
||||
.pack('V', $this->offset) // relative offset of local header
|
||||
.$filepath;
|
||||
|
||||
$this->offset = strlen($this->zipdata);
|
||||
$this->entries++;
|
||||
$this->file_num++;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Read the contents of a file and add it to the zip
|
||||
*
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
function read_file($path, $preserve_filepath = FALSE)
|
||||
{
|
||||
if ( ! file_exists($path))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (FALSE !== ($data = file_get_contents($path)))
|
||||
{
|
||||
$name = str_replace("\\", "/", $path);
|
||||
|
||||
if ($preserve_filepath === FALSE)
|
||||
{
|
||||
$name = preg_replace("|.*/(.+)|", "\\1", $name);
|
||||
}
|
||||
|
||||
$this->add_data($name, $data);
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Read a directory and add it to the zip.
|
||||
*
|
||||
* This function recursively reads a folder and everything it contains (including
|
||||
* sub-folders) and creates a zip based on it. Whatever directory structure
|
||||
* is in the original file path will be recreated in the zip file.
|
||||
*
|
||||
* @access public
|
||||
* @param string path to source
|
||||
* @return bool
|
||||
*/
|
||||
function read_dir($path)
|
||||
{
|
||||
if ($fp = @opendir($path))
|
||||
{
|
||||
while (FALSE !== ($file = readdir($fp)))
|
||||
{
|
||||
if (@is_dir($path.$file) && substr($file, 0, 1) != '.')
|
||||
{
|
||||
$this->read_dir($path.$file."/");
|
||||
}
|
||||
elseif (substr($file, 0, 1) != ".")
|
||||
{
|
||||
if (FALSE !== ($data = file_get_contents($path.$file)))
|
||||
{
|
||||
$this->add_data(str_replace("\\", "/", $path).$file, $data);
|
||||
}
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Get the Zip file
|
||||
*
|
||||
* @access public
|
||||
* @return binary string
|
||||
*/
|
||||
function get_zip()
|
||||
{
|
||||
// Is there any data to return?
|
||||
if ($this->entries == 0)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
$zip_data = $this->zipdata;
|
||||
$zip_data .= $this->directory."\x50\x4b\x05\x06\x00\x00\x00\x00";
|
||||
$zip_data .= pack('v', $this->entries); // total # of entries "on this disk"
|
||||
$zip_data .= pack('v', $this->entries); // total # of entries overall
|
||||
$zip_data .= pack('V', strlen($this->directory)); // size of central dir
|
||||
$zip_data .= pack('V', strlen($this->zipdata)); // offset to start of central dir
|
||||
$zip_data .= "\x00\x00"; // .zip file comment length
|
||||
|
||||
return $zip_data;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Write File to the specified directory
|
||||
*
|
||||
* Lets you write a file
|
||||
*
|
||||
* @access public
|
||||
* @param string the file name
|
||||
* @return bool
|
||||
*/
|
||||
function archive($filepath)
|
||||
{
|
||||
if ( ! ($fp = @fopen($filepath, FOPEN_WRITE_CREATE_DESTRUCTIVE)))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
flock($fp, LOCK_EX);
|
||||
fwrite($fp, $this->get_zip());
|
||||
flock($fp, LOCK_UN);
|
||||
fclose($fp);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Download
|
||||
*
|
||||
* @access public
|
||||
* @param string the file name
|
||||
* @param string the data to be encoded
|
||||
* @return bool
|
||||
*/
|
||||
function download($filename = 'backup.zip')
|
||||
{
|
||||
if ( ! preg_match("|.+?\.zip$|", $filename))
|
||||
{
|
||||
$filename .= '.zip';
|
||||
}
|
||||
|
||||
$zip_content =& $this->get_zip();
|
||||
|
||||
$CI =& get_instance();
|
||||
$CI->load->helper('download');
|
||||
|
||||
force_download($filename, $zip_content);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Initialize Data
|
||||
*
|
||||
* Lets you clear current zip data. Useful if you need to create
|
||||
* multiple zips with different data.
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
function clear_data()
|
||||
{
|
||||
$this->zipdata = '';
|
||||
$this->directory = '';
|
||||
$this->entries = 0;
|
||||
$this->file_num = 0;
|
||||
$this->offset = 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* End of file Zip.php */
|
||||
/* Location: ./system/libraries/Zip.php */
|
||||
@@ -0,0 +1,10 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>403 Forbidden</title>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<p>Directory access is forbidden.</p>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user