oont-contents/plugins/ultimate-member/includes/core/class-validation.php
2025-02-08 15:10:23 +01:00

428 lines
9.7 KiB
PHP

<?php
namespace um\core;
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
if ( ! class_exists( 'um\core\Validation' ) ) {
/**
* Class Validation
* @package um\core
*/
class Validation {
/**
* @var string
*/
public $regex_safe = '/\A[\w\-\.]+\z/';
/**
* @var string
*/
public $regex_username_safe = '|[^a-z0-9 _.\-@]|i';
/**
* @var string
*/
public $regex_phone_number = '/\A[\d\-\.\+\(\)\ ]+\z/';
/**
* Validation constructor.
*/
public function __construct() {
add_filter( 'um_user_pre_updating_files_array', array( $this, 'validate_files' ) );
add_filter( 'um_before_save_filter_submitted', array( $this, 'validate_fields_values' ), 10, 3 );
}
/**
* Validate files before upload
*
* @param $files
*
* @return mixed
*/
function validate_files( $files ) {
if ( ! empty( $files ) ) {
foreach ( $files as $key => $filename ) {
if ( validate_file( $filename ) !== 0 ) {
unset( $files[ $key ] );
}
}
}
return $files;
}
public function validate_fields_values( $changes, $args, $form_data ) {
$fields = maybe_unserialize( $form_data['custom_fields'] );
foreach ( $changes as $key => $value ) {
if ( ! isset( $fields[ $key ] ) ) {
continue;
}
//rating field validation
if ( isset( $fields[ $key ]['type'] ) && 'rating' === $fields[ $key ]['type'] ) {
if ( ! is_numeric( $value ) ) {
unset( $changes[ $key ] );
} else {
if ( $fields[ $key ]['number'] == 5 ) {
if ( ! in_array( $value, range( 1, 5 ) ) ) {
unset( $changes[ $key ] );
}
} elseif ( $fields[ $key ]['number'] == 10 ) {
if ( ! in_array( $value, range( 1, 10 ) ) ) {
unset( $changes[ $key ] );
}
}
}
}
//validation of correct values from options in wp-admin
$stripslashes = $value;
if ( is_string( $value ) ) {
$stripslashes = stripslashes( $value );
}
// Dynamic dropdown options population
$has_custom_source = apply_filters("um_has_dropdown_options_source__{$key}", false );
if ( in_array( $fields[ $key ]['type'], array( 'select','multiselect' ), true ) && $has_custom_source ) {
/** This filter is documented in includes/core/class-fields.php */
$fields[ $key ] = apply_filters( "um_get_field__{$key}", $fields[ $key ] );
if ( is_array( $fields[ $key ] ) && array_key_exists( 'options', $fields[ $key ] ) ) {
$fields[ $key ]['options'] = array_keys( $fields[ $key ]['options'] );
}
}
// Dropdown options source from callback function
if ( in_array( $fields[ $key ]['type'], array( 'select','multiselect' ), true ) &&
isset( $fields[ $key ]['custom_dropdown_options_source'] ) &&
! empty( $fields[ $key ]['custom_dropdown_options_source'] ) &&
function_exists( $fields[ $key ]['custom_dropdown_options_source'] ) ) {
if ( ! UM()->fields()->is_source_blacklisted( $fields[ $key ]['custom_dropdown_options_source'] ) ) {
$arr_options = call_user_func( $fields[ $key ]['custom_dropdown_options_source'] );
$fields[ $key ]['options'] = array_keys( $arr_options );
}
}
// Unset changed value that doesn't match the option list
if ( in_array( $fields[ $key ]['type'], array( 'select' ) ) &&
! empty( $stripslashes ) && ! empty( $fields[ $key ]['options'] ) &&
! in_array( $stripslashes, array_map( 'trim', $fields[ $key ]['options'] ) ) ) {
unset( $changes[ $key ] );
}
//validation of correct values from options in wp-admin
//the user cannot set invalid value in the hidden input at the page
if ( in_array( $fields[ $key ]['type'], array( 'multiselect', 'checkbox', 'radio' ) ) &&
! empty( $value ) && ! empty( $fields[ $key ]['options'] ) ) {
$value = array_map( 'stripslashes', array_map( 'trim', $value ) );
$changes[ $key ] = array_intersect( $value, array_map( 'trim', $fields[ $key ]['options'] ) );
}
}
return $changes;
}
/**
* Removes html from any string
*
* @param $string
*
* @return string
*/
function remove_html( $string ) {
return wp_strip_all_tags( $string );
}
/**
* Normalize a string
*
* @param $string
*
* @return mixed
*/
function normalize( $string ) {
$string = preg_replace('~&([a-z]{1,2})(acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);~i', '$1', htmlentities($string, ENT_QUOTES, 'UTF-8'));
return $string;
}
/**
* Safe name usage ( for url purposes )
*
* @param $name
*
* @return mixed|string
*/
function safe_name_in_url( $name ) {
$name = strtolower( $name );
$name = preg_replace("/'/","", $name );
$name = stripslashes( $name );
$name = $this->normalize($name);
$name = rawurldecode( $name );
return $name;
}
/**
* Password strength test
*
* @param string $candidate
*
* @return bool
*/
function strong_pass( $candidate ) {
// are used Unicode Regular Expressions
$regexps = [
'/[\p{Lu}]/u', // any Letter Uppercase symbol
'/[\p{Ll}]/u', // any Letter Lowercase symbol
'/[\p{N}]/u', // any Number symbol
];
foreach ( $regexps as $regexp ) {
if ( preg_match_all( $regexp, $candidate, $o ) < 1 ) {
return false;
}
}
return true;
}
/**
* Space, dash, underscore
*
* @param $string
*
* @return bool
*/
function safe_username( $string ) {
/**
* UM hook
*
* @type filter
* @title um_validation_safe_username_regex
* @description Change validation regex for username
* @input_vars
* [{"var":"$regex_safe","type":"string","desc":"Regex"}]
* @change_log
* ["Since: 2.0"]
* @usage
* <?php add_filter( 'um_validation_safe_username_regex', 'function_name', 10, 1 ); ?>
* @example
* <?php
* add_filter( 'um_validation_safe_username_regex', 'my_validation_safe_username', 10, 1 );
* function my_validation_safe_username( $regex_safe ) {
* // your code here
* return $regex_safe;
* }
* ?>
*/
$regex_safe_username = apply_filters( 'um_validation_safe_username_regex', $this->regex_username_safe );
if ( is_email( $string ) ) {
return true;
}
if ( ! is_email( $string ) && preg_match( $regex_safe_username, $string ) ) {
return false;
}
return true;
}
/**
* Dash and underscore (metakey)
*
* @param $string
*
* @return bool
*/
function safe_string( $string ) {
/**
* UM hook
*
* @type filter
* @title um_validation_safe_string_regex
* @description Change validation regex for each string
* @input_vars
* [{"var":"$regex_safe","type":"string","desc":"Regex"}]
* @change_log
* ["Since: 2.0"]
* @usage
* <?php add_filter( 'um_validation_safe_string_regex', 'function_name', 10, 1 ); ?>
* @example
* <?php
* add_filter( 'um_validation_safe_string_regex', 'my_validation_safe_string', 10, 1 );
* function my_validation_safe_string( $regex_safe ) {
* // your code here
* return $regex_safe;
* }
* ?>
*/
$regex_safe_string = apply_filters( 'um_validation_safe_string_regex', $this->regex_safe );
if ( ! preg_match( $regex_safe_string, $string ) ) {
return false;
}
return true;
}
/**
* Ss phone number
*
* @param $string
*
* @return bool
*/
function is_phone_number( $string ) {
if ( ! $string ) {
return true;
}
if ( ! preg_match( $this->regex_phone_number, $string ) ) {
return false;
}
return true;
}
/**
* Is Discord ID?
*
* @param $string
*
* @return bool
*/
public function is_discord_id( $string ) {
if ( ! $string ) {
return true;
}
if ( strlen( $string ) < 2 || strlen( $string ) > 31 ) {
return false;
}
if ( ! preg_match( '/^[a-z\d_]+(?:\.[a-z\d_]+)*(\.[a-z]*)?$/', trim( $string ) ) ) {
return false;
}
return true;
}
/**
* Is url
*
* @param $url
* @param bool $social
*
* @return bool
*/
function is_url( $url, $social = false ) {
if ( ! $url ) {
return true;
}
if ( $social ) {
if ( strstr( $url, $social ) && '' != str_replace( $social, '', $url ) ) {
return true;
}
} else {
if ( strstr( $url, 'http://' ) || strstr( $url, 'https://' ) ) {
return true;
}
}
return false;
}
/**
* Get a random string
*
* @param int $length
*
* @return string
*/
function randomize( $length = 10 ) {
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$result = '';
for ( $i = 0; $i < $length; $i++ ) {
$result .= $characters[ rand( 0, strlen( $characters ) - 1 ) ];
}
return $result;
}
/**
* Generate a password, hash, or similar
*
* @param int $length
*
* @return string
*/
function generate( $length = 40 ) {
return wp_generate_password( $length, false );
}
/**
* Random numbers only
*
* @param bool $len
*
* @return int|string
*/
function random_number( $len = false ) {
$ints = array();
$len = $len ? $len : rand( 2, 9 );
if ( $len > 9 ) {
trigger_error( 'Maximum length should not exceed 9' );
return 0;
}
while( true ) {
$current = rand(0,9);
if ( ! in_array( $current, $ints ) ) {
$ints[] = $current;
}
if ( count( $ints ) == $len ) {
return implode( $ints );
}
}
}
/**
* To validate given date input
*
* @param $date
* @param string $format
*
* @return bool
*/
function validate_date( $date, $format = 'YYYY/MM/D' ) {
if ( strlen( $date ) < strlen( $format ) ) {
return false;
}
if ( $date[4] != '/' ) {
return false;
}
if ( $date[7] != '/' ) {
return false;
}
if ( false === strtotime( $date ) ) {
return false;
}
return true;
}
}
}