| <?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, 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();
|
| 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
|
| * @return bool
|
| */
|
| function matches($str, $field)
|
| {
|
| if (! isset($_POST[$field]))
|
| {
|
| return FALSE;
|
| }
|
|
|
| return ($str !== $_POST[$field]) ? FALSE : TRUE;
|
| }
|
|
|
| // --------------------------------------------------------------------
|
|
|
| /**
|
| * Minimum Length
|
| *
|
| * @access public
|
| * @param string
|
| * @return bool
|
| */
|
| function min_length($str, $val)
|
| {
|
| if (preg_match("/[^0-9]/", $val))
|
| {
|
| return FALSE;
|
| }
|
|
|
| return (strlen($str) < $val) ? FALSE : TRUE;
|
| }
|
|
|
| // --------------------------------------------------------------------
|
|
|
| /**
|
| * Max Length
|
| *
|
| * @access public
|
| * @param string
|
| * @return bool
|
| */
|
| function max_length($str, $val)
|
| {
|
| if (preg_match("/[^0-9]/", $val))
|
| {
|
| return FALSE;
|
| }
|
|
|
| return (strlen($str) > $val) ? FALSE : TRUE;
|
| }
|
|
|
| // --------------------------------------------------------------------
|
|
|
| /**
|
| * Exact Length
|
| *
|
| * @access public
|
| * @param string
|
| * @return bool
|
| */
|
| function exact_length($str, $val)
|
| {
|
| if (preg_match("/[^0-9]/", $val))
|
| {
|
| return FALSE;
|
| }
|
|
|
| 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);
|
| }
|
|
|
| // --------------------------------------------------------------------
|
|
|
| /**
|
| * 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);
|
| }
|
| }
|
|
|
| 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 */ |