View file system/PHP-classes/valid.class.php

File size: 18.33Kb
<?php 

/*
---------------------------------
Класс для валидации форм отправки
---------------------------------
*/
  
class valid {
  
  public static $e = 0;
  
  /*
  -----
  Капча
  -----
  */
  
  static function captcha(){
    
    global $captcha_random_seed;
    
    if (!post('captcha') or !post('captcha_key')) {
      
      self::$e = 1;
      error('Вы не ввели числа с картинки');
    
    }
    
    if (md5((int)post('captcha') + $captcha_random_seed) != post('captcha_key')) {
      
      self::$e = 1;
      error('Числа с картинки введены неверно');
    
    }
  
  }
  
  /*
  -------
  Правила
  -------
  */
  
  static function rules(){
    
    if (post('rules') == 0) {
      
      self::$e = 1;
      error('Вы не подтвердили, что обязуетесь соблюдать правила сайта');
    
    }
  
  }
  
  /*
  ---------------
  Проверка пароля
  ---------------
  */
  
  static function password($name, $post){

    //$name - имя объекта из массива
    //$post - имя для передачи POST запроса

    $password = esc(post($post));
    
    define($name, $password);
    
    if (post('password2') != $password){
      
      self::$e = 1;
      error('Пароли не совпадают');
    
    }
    
    if (str($password) < 8){
      
      self::$e = 1;
      error('Пароль не может быть меньше 8 символов');
    
    }
    
    if (str($password) > 20){
      
      self::$e = 1;
      error('Пароль не может быть больше 20 символов');
    
    }
    
    if (!preg_match("#^([A-zА-яё0-9\-_@.%+])+$#ui", $password)) {
      
      self::$e = 1;
      error('В пароле присутствуют запрещенные символы. Используйте только латиницу, кириллицу, цифры и символы "_-@.%+"');
    
    }
  
  }
  
  /*
  ---------------------------
  Проверка пароля на верность
  ---------------------------
  */
  
  static function password_check($name, $post, $user_id){

    //$name - имя объекта из массива
    //$post - имя для передачи POST запроса
    //$user_id - id пользователя
    
    $password = shif(esc(post($post)));
    $user_id = abs(intval($user_id));
    
    define($name, $password);
    
    if (db::get_column("SELECT COUNT(`ID`) FROM `USERS` WHERE `PASSWORD` = ? AND `ID` = ? LIMIT 1", [$password, $user_id]) == 0) {      
      
      self::$e = 1;
      error('Неверный пароль');
    
    }
  
  }
  
  /*
  ---------------
  Проверка логина
  ---------------
  */
  
  static function login($name, $post, $double){

    //$name - имя объекта из массива
    //$post - имя для передачи POST запроса
    //$double - проверка логина на занятость

    $login = esc(post($post));
    
    define($name, $login);
    
    if (str($login) > config('REG_STR')){
      
      self::$e = 1;
      error('Слишком длинный логин');
    
    }
    
    if (str($login) < 3){
      
      self::$e = 1;
      error('Логин не может быть меньше 3 символов');
    
    }
    
    if ($double == 0 && config('REG_DOUBLE') == 0 && db::get_column("SELECT COUNT(`ID`) FROM `USERS` WHERE `LOGIN` = ? LIMIT 1", [$login]) == 1) {      
      
      self::$e = 1;
      error('Логин уже занят. Придумайте другой');
    
    }
    
    if (config('REG_LANG') == 1){ 
      
      if (!preg_match("#^([A-z0-9\-_.])+$#ui", $login)) {
        
        self::$e = 1;
        error('В логине присутствуют запрещенные символы. Только латиница, символы "_-." и цифры');
        
      }
      
      if (!preg_match("~([A-z])~", $login)){
        
        self::$e = 1;
        error('В логине должна содержаться хотябы одна буква (только латиница)');
      
      }
      
    }
    
    if (config('REG_LANG') == 2){ 
      
      if (!preg_match("#^([А-яё0-9\-_.])+$#ui", $login)){        
        
        self::$e = 1;
        error('В логине присутствуют запрещенные символы. Только кириллица, символы "_-." и цифры');
        
      }
      
      if (!preg_match("~([А-яё])~", $login)){
        
        self::$e = 1;
        error('В логине должна содержаться хотябы одна буква (только кириллица)');
      
      }
    
    }
    
    if (config('REG_LANG') == 0){
      
      if (!preg_match("#^([A-zА-яё0-9\-_.])+$#ui", $login)){
        
        self::$e = 1;
        error('В логине присутствуют запрещенные символы. Только кириллица, латиница, символы "_-." и цифры');
        
      }
      
      if (!preg_match("~([A-zА-яё])~", $login)){
        
        self::$e = 1;
        error('В логине должна содержаться хотябы одна буква (кириллица или латиница)');
      
      }
    
    }
    
    if (substr_count($login, '.') > 1) {
      
      self::$e = 1;
      error('Запрещено использовать символ "." два или более раза');
    
    }
    
    if (substr_count($login, '-') > 1) {
      
      self::$e = 1;
      error('Запрещено использовать символ "-" два или более раза');
    
    }
    
    if (substr_count($login, '_') > 1) {
      
      self::$e = 1;
      error('Запрещено использовать символ "_" два или более раза');
    
    }
  
  }
  
  /*
  ----------------
  Текстовые данные
  ----------------
  */
  
  static function text($name, $post, $from, $before, $fact_name, $copy = 1, $attach = 0){
    
    //$name - имя объекта из массива
    //$post - имя для передачи POST запроса
    //$from - допустимое количество символов ОТ
    //$before - допустимое количество символов ДО
    //$fact_name - фактическое имя объекта для обозначения при сообщениях об ошибке
    //$copy - флажок включения/выключения сверки недавно добавленных содержимых
    //$attach - отключение проверки на минимальное количество символов если прикреплен файл

    $text = esc(post($post));
    $from = tabs(esc($from));
    $before = tabs(esc($before));
    $fact_name = tabs(esc($fact_name));    

    define($name, $text);
    
    if ($copy == 1 && session($post) == $text){ 
      
      self::$e = 1;
      error(lg('В поле "%s" используется содержание, которое использовалось недавно', $fact_name)); 
    
    }
    
    if ($copy == 1){
      
      session($post, $text);
      
    }
    
    if ($before > 0 && $from < $before){
      
      if (str($text) < $from && $attach == 0){ 
        
        self::$e = 1;
        error(lg('В поле "%s" количество символов не может быть меньше %d', $fact_name, $from));
      
      }
      
      if (str($text) > $before){ 
        
        self::$e = 1;
        error(lg('В поле "%s" количество символов не может быть больше %d', $fact_name, $before));
      
      }
      
    }
    
  }
  
  /*
  ------
  Ссылки
  ------
  */
  
  static function link($name, $post, $from, $before, $fact_name){
    
    //$name - имя объекта из массива
    //$post - имя для передачи POST запроса
    //$from - допустимое количество символов ОТ
    //$before - допустимое количество символов ДО
    //$fact_name - фактическое имя объекта для обозначения при сообщениях об ошибке
    
    $link = esc(post($post));
    $from = abs(intval($from));
    $before = abs(intval($before)); 
    
    define($name, $link);
    
    if (str($link) > 0 && url_filter($link) == false){ 
      
      self::$e = 1;
      error('Не корректно указана ссылка'); 
    
    }
    
    if ($before > 0 && $from < $before){
      
      if (str($link) < $from){ 
        
        self::$e = 1;
        error(lg('В поле "%s" количество символов не может быть меньше %d', $fact_name, $from));
      
      }
      
      if (str($link) > $before){ 
        
        self::$e = 1;
        error(lg('В поле "%s" количество символов не может быть больше %d', $fact_name, $before));
      
      }
      
    }
    
  }
  
  /*
  ---------------------
  Неотрицательные числа
  ---------------------
  */
  
  static function number($name, $post, $from, $before, $fact_name){
    
    //$name - имя объекта из массива
    //$post - имя для передачи POST запроса
    //$from - допустимое количество чисел ОТ
    //$before - допустимое количество чисел ДО
    //$fact_name - фактическое имя объекта для обозначения при сообщениях об ошибке
    
    $number = abs(intval(post($post)));
    $from = abs(intval($from));
    $before = abs(intval($before));

    define($name, $number);
    
    if ($before > 0 && $from < $before){
      
      if ($number < $from){ 
        
        self::$e = 1;
        error(lg('В поле "%s" значение не может быть меньше %d', $fact_name, $from));
      
      }
      
      if ($number > $before){ 

        self::$e = 1;
        error(lg('В поле "%s" значение не может быть больше %d', $fact_name, $before));
      
      }
      
    }
    
  }
  
  /*
  ----------------
  Абсолютные числа
  ----------------
  */
  
  static function number_abs($name, $post, $from, $before, $fact_name){
    
    //$name - имя объекта из массива
    //$post - имя для передачи POST запроса
    //$from - допустимое количество чисел ОТ
    //$before - допустимое количество чисел ДО
    //$fact_name - фактическое имя объекта для обозначения при сообщениях об ошибке
    
    $number = abs(post($post));
    $from = abs($from);
    $before = abs($before);

    define($name, $number);
    
    if ($before > 0 && $from < $before){
      
      if ($number < $from){ 
        
        self::$e = 1;
        error(lg('В поле "%s" значение не может быть меньше %d', $fact_name, $from));
      
      }
      
      if ($number > $before){ 

        self::$e = 1;
        error(lg('В поле "%s" значение не может быть больше %d', $fact_name, $before));
      
      }
      
    }
    
  }
  
  /*
  -----------
  Целые числа
  -----------
  */
  
  static function number_int($name, $post, $from, $before, $fact_name){
    
    //$name - имя объекта из массива
    //$post - имя для передачи POST запроса
    //$from - допустимое количество чисел ОТ
    //$before - допустимое количество чисел ДО
    //$fact_name - фактическое имя объекта для обозначения при сообщениях об ошибке
    
    $number = intval(post($post));
    $from = intval($from);
    $before = intval($before);

    define($name, $number);
    
    if ($before > 0 && $from < $before){
      
      if ($number < $from){ 
        
        self::$e = 1;
        error(lg('В поле "%s" значение не может быть меньше %d', $fact_name, $from));
      
      }
      
      if ($number > $before){ 

        self::$e = 1;
        error(lg('В поле "%s" значение не может быть больше %d', $fact_name, $before));
      
      }
      
    }
    
  }
  
  /*
  ----------------------------
  Проверка e-mail на занятость
  ----------------------------
  */
  
  static function email_check($name, $post){

    //$name - имя объекта из массива
    //$post - имя для передачи POST запроса

    $email = esc(post($post));
    
    define($name, $email);
    
    if (db::get_column("SELECT COUNT(`ID`) FROM `USERS` WHERE `EMAIL` = ? LIMIT 1", [$email]) == 1) {      
      
      self::$e = 1;
      error('Этот e-mail адрес уже зарегистрирован на сайте');
    
    }
  
  }
  
  /*
  ------
  E-mail
  ------
  */
  
  static function email($name, $post, $from, $before, $fact_name, $reg_mode = 2){
    
    //$name - имя объекта из массива
    //$post - имя для передачи POST запроса
    //$from - допустимое количество символов ОТ
    //$before - допустимое количество символов ДО
    //$reg_mode - режим регистрации через e-mail
    //$fact_name - фактическое имя объекта для обозначения при сообщениях об ошибке

    $email = esc(post($post));
    $from = abs(intval($from));
    $before = abs(intval($before));
    $reg_mode = abs(intval($reg_mode));

    define($name, $email);
    
    if ($reg_mode == 2){
      
      if (!filter_var($email, FILTER_VALIDATE_EMAIL)){ 
        
        self::$e = 1;
        error('Не корректно указан E-mail'); 
      
      }
      
      if ($before > 0 && $from < $before){
        
        if (str($email) < $from){ 
          
          self::$e = 1;
          error(lg('В поле "%s" количество символов не может быть меньше %d', $fact_name, $from));
        
        }
        
        if (str($email) > $before){ 
          
          self::$e = 1;
          error(lg('В поле "%s" количество символов не может быть больше %d', $fact_name, $before));
        
        }
      
      }
      
    }
    
  }
  
  /*
  -----------
  Авторизация
  -----------
  */
  
  static function aut(){
    
    global $captcha_random_seed;
    
    $login = esc(post('login'));
    $password = shif(esc(post('password')));
    
    define('AUT_LOGIN', $login);
    define('AUT_PASSWORD', $password);
    
    if (db::get_column("SELECT COUNT(`ID`) FROM `USERS` WHERE `LOGIN` = ? AND `PASSWORD` = ? LIMIT 1", [AUT_LOGIN, AUT_PASSWORD]) == 0){ 
      
      self::$e = 1;
      error('Неправильный логин или пароль');
    
    }
    
    if (session('captcha') == 1){
      
      self::captcha();
    
    }
  
  }
  
  /*
  ----------------------------------------------
  Создаем образ с проверкой POST данных из формы
  ----------------------------------------------
  */
  
  public static function create($data){
    
    db_filter();
    post_check_valid();
    hooks::run('post_valid');
    
    foreach ($data as $name => $valid){
      
      if (!isset($valid[1])){ $valid[1] = 'none'; }
      if (!isset($valid[0])){ $valid[0] = 'none'; }
      if (!isset($valid[2])){ $valid[2] = 'none'; }
      if (!isset($valid[2][0])){ $valid[2][0] = 'none'; }
      if (!isset($valid[2][1])){ $valid[2][1] = 'none'; }
      if (!isset($valid[3])){ $valid[3] = 'none'; }
      if (!isset($valid[4])){ $valid[4] = 'none'; }
      if (!isset($valid[5])){ $valid[5] = 'none'; }
      if (!isset($name)){ $name = 'none'; }
      
      //Текстовые данные
      if ($valid[1] == 'text'){
        
        self::text($name, $valid[0], $valid[2][0], $valid[2][1], $valid[3], $valid[4], $valid[5]);
        
      }
      
      //Ссылки
      if ($valid[1] == 'link'){        
        
        self::link($name, $valid[0], $valid[2][0], $valid[2][1], $valid[3]);
        
      }
      
      //Авторизация
      if ($name == 'aut'){

        self::aut();
        
      }
      
      //Капча
      if ($name == 'captcha'){
        
        self::captcha();
        
      }
      
      //Правила
      if ($name == 'rules'){

        self::rules();
        
      }
      
      //Логин
      if ($valid[1] == 'login'){

        self::login($name, $valid[1], intval($valid[2]));
        
      }
      
      //Пароль
      if ($valid[1] == 'password'){

        self::password($name, $valid[0], $valid[1]);
        
      }
      
      //Проверка пароля на верность
      if ($valid[1] == 'password_check'){

        self::password_check($name, $valid[0], $valid[2]);
        
      }
      
      //Проверка e-mail на занятость
      if ($valid[1] == 'email_check'){

        self::email_check($name, $valid[0]);
        
      }
      
      //E-mail
      if ($valid[1] == 'email'){
        
        self::email($name, $valid[0], $valid[2][0], $valid[2][1], $valid[3], $valid[4]);
        
      }
      
      //Неотрицательные числа
      if ($valid[1] == 'number'){
        
        self::number($name, $valid[0], $valid[2][0], $valid[2][1], $valid[3]);
        
      }
      
      //Абсолютные числа
      if ($valid[1] == 'number_abs'){
        
        self::number_abs($name, $valid[0], $valid[2][0], $valid[2][1], $valid[3]);
        
      }
      
      //Целые числа
      if ($valid[1] == 'number_int'){
        
        self::number_int($name, $valid[0], $valid[2][0], $valid[2][1], $valid[3]);
        
      }
    
    }
    
    //Регистрируем статус ошибки как временную константу
    if (self::$e == 1){ 
      
      define('ERROR_LOG', 1); 
    
    }else{ 
      
      define('ERROR_LOG', 0); 
    
    }
    
  }
  
}