* @copyright: Copyright (c) 2010, Bunzia Alexander * @version: 1.0 * @license: http://www.gnu.org/copyleft/gpl.html GNU/GPL * @package: HiLo CMS */ include_once(MAIN_SOURCE_PATH.'/inc/class.query.php'); include_once(MAIN_SOURCE_PATH.'/inc/class.objects.php'); include_once(MAIN_SOURCE_PATH.'/modules/users/inc/url.php'); include_once(MAIN_SOURCE_PATH.'/modules/users/lang/'.MAIN_LANG.'/lang.php'); class filedsSetUsers { //static $id = false; // адрес новости static function u_login($v,$obj){ $e = users::error_login($v); if ( !empty($e) ){ throw new Exception($e); } if ( users::exists_login($v,$obj -> id() ) ){ throw new Exception(U_EXISTS_LOGIN); } return $v; } static function u_pass($v,$obj){ // пароль не меняется if ( empty($v) && $obj -> id()!=0 ){ return false; } $e = users::error_pass($v); if ( !empty($e) ){ throw new Exception($e); } return users::make_pass($v); } static function u_pass_re($v,$obj){ if ( empty($obj -> set_info['u_pass']) && empty($v) && $obj -> id()!=0 ){ return false; } if ( $obj -> set_info['u_pass']!=$v ){ throw new Exception(U_BAD_PASS_RE); } return false; } static function u_email($v,$obj){ $e = users::error_email($v); if ( !empty($e) ){ throw new Exception($e); } if ( users::exists_email($v,$obj -> id() ) ){ throw new Exception(U_EXISTS_EMAIL); } return $v; } public function u_name($v){ if ( empty($v) ){ throw new Exception(U_ERROR_EMPTY_NAME); } return $v; } public function u_dob($v){ if ( empty($v) ){ return false; } if ( !preg_match('#^[0-9]{4,4}-[0-9]{1,2}-[0-9]{1,2}$#iUs',$v) ){ throw new Exception(U_ERROR_FALSE_DOB); } return $v; } public function agree_rules($v){ if ( empty($v) ){ throw new Exception('Ошибка: нельзя закончить регистрацию, не согласившись с правилами!'); } return false; } public function captcha($v){ if ( false===captcha::check() ){ throw new Exception('Ошибка: код с картинке введён неверно!'); } return false; } /* public function g_type($v){ $array = array('admin','user','guest'); if ( !in_array($v,$array) ){ sys_error( '500'); } return $v; }*/ public function g_id($v){ $v = intval($v); if ( empty($v) ){ throw new Exception(U_ERROR_FALSE_GROUP); } return $v; } public function set_g_name($v){ if ( empty($v) ){ sys_error( '500'); } return $v; } public function u_avatar($v){ if ( empty($v) ){ return $v; } if ( !preg_match('#^([x_0-9]*)\.jpg|jpeg|gif|png$#iUs',$v) ){ return false; } return $v; } static function u_active($v){ return !empty($v) ? 1 : 0; } } class filedsGetUsers { static $__var = array(); // для хранения временных переменных static function u_active_checked($v){ return !empty($v) ? 'checked' : ''; } static function upl_img($v){ global $MAIN_PAGE; $a = new upload_img('avatar'); $a -> set_max_size( 500000 ); $a -> set_crop($MAIN_PAGE -> config('users_avatar_width'),$MAIN_PAGE -> config('users_avatar_height')); $a -> set_file($v); $a -> set_path( 'users/ava'); $a -> set_base( MAIN_URL.'/media/users/ava'); return $a -> get('ava',1,'u_avatar'); } static function groups_list($v){ $gl = new group_select_box(); return $gl -> group_list( $v ); } static function profile_url($v){ return sys_url(URL_USERS_PROFILE,$v); } // логин на входе static function url_user_comments($v){ include_once(MAIN_SOURCE_PATH.'/modules/admin/inc/url.php'); return sys_url(URL_ADMIN_COMMENTS_FILTER_URL,false,false,false,$v,false); } static function avatar_src($v){ if ( empty($v) ){ return false; } return '/media/users/ava/'.$v; } static function forget_url($v,$row){ return MAIN_URL.'/?p_name=users_profile&act=forget_end&code='.$v.'&id='.$row['u_id']; } static function user_type($v){ if ($v==1){ return U_USERS_MEMBER_TYPE; }elseif( $v==2 ){ return U_USERS_ORG_TYPE; }else{ sys_error(500); } } /*static function u_time_reg($v){ return date('d.m.Y',$v); }*/ static function time_reg($v){ return date('d.m.Y',$v); } static function array_dob($v){ $v = explode('.',$v); return array('year'=>$v[0],'month'=>$v[1],'day'=>$v[2]); } static function u_day($v){ $v = explode('-',$v); return $v[2]; } static function u_month($v){ $v = explode('-',$v); return $v[1]; } static function u_year($v){ $v = explode('-',$v); return $v[0]; } } class usersQuery extends query{ var $fields_get = 'filedsGetUsers'; /** * @var string $alias Алиас для исплользования в mysql запросе */ public function __construct($alias){ $this -> set_table(MAIN_USERS_TBL ); $this -> set_alias($alias); } public function include_groups($alias,$cols=''){ $this -> include_table( MAIN_GROUP_TBL ,$alias,'g_id',$cols ); } public function where_id($id){ $id = intval($id); if ( empty($id) ){ return false; } return $this -> set_where( $this -> alias.'.u_id',$id); } public function where_not_id($id){ $id = intval($id); if ( empty($id) ){ return false; } return $this -> set_anothe_where( $this -> alias.'.u_id!= "'.$id.'"'); } public function where_login($l){ $error_login = users::error_login($l); if ( $error_login ){ return false; } return $this -> set_where( $this -> alias.'.u_login',$l); } public function where_actcode($v){ if ( preg_match('#[^0-9a-z]#',$v) ){ return false; } return $this -> set_where( $this -> alias.'.u_act_code',$v); } public function where_like_login($v){ if ( false!==users::error_login($v) ){ return FALSE; } return $this -> set_anothe_where( $this -> alias.'.u_login LIKE "'.$v.'%"'); } public function where_email($l){ $e = users::error_email($l); if ( $e ){ return false; } $a = $this -> get_alias(MAIN_USERS_TBL); return $this -> set_where( $a.'.u_email',$l); } public function where_active($v){ $v = intval($v); return $this -> set_where( $this -> alias.'.u_active',$v); } public function where_group($v){ $v = intval($v); return $this -> set_where( $this -> alias.'.g_id',$v); } public function orderby_id($v){ return $this -> set_orderby($this -> alias.'.u_id',$v); } public function orderby_login($v){ return $this -> set_orderby($this -> alias.'.u_login',$v); } } // end class metasQuery class users extends objects{ public $table = "users"; public $key = "u_id"; public $fields = 'filedsSetUsers'; static function query($a){ return new usersQuery($a); } // обновление сессии пользователя public function user_session($save){ global $MAIN_PAGE; if ( false===$this -> id()){ return false; } $s_data = serialize(array( self::make_pass($this -> pass()), $this -> id(), (!empty($save) ? 1 : 0) )); if ( $save){ $time_live_cookie = MAIN_TIME+60*60*24*30; }else{ $time_live_cookie = 0; } setcookie($MAIN_PAGE -> config('sys_cookie_name'), $s_data, $time_live_cookie, '/', '', 0); } public function id(){ return $this -> u_id; } public function group(){ return $this -> g_id; } public function pass(){ return $this -> u_pass; } public function active(){ return $this -> u_active; } public function login(){ return $this -> u_login; } public function email(){ return $this -> u_email; } public function name(){ return $this -> u_name; } public function act_code(){ return $this -> u_act_code; } public function avatar(){ return $this -> u_avatar; } public function avatar_src(){ if ( empty($this -> u_avatar) ){ return false; } return '/media/users/ava/'.$this -> u_avatar; } public function profile_url(){ return sys_url(URL_USERS_PROFILE,$this -> login() ); } public function lang(){ if ( empty($_GET['lng_set']) ){ return $this -> u_lang; }elseif( sys_check_lang($_GET['lng_set']) ){ return $_GET['lng_set']; }else{ return MAIN_LANG; } } public function check_right_page($f_id){ global $MAIN_DB; $f_id = intval($f_id); if ( empty($f_id) ){ sys_error( '500'); } $sql = " SELECT COUNT(*) FROM ".MAIN_GRP_PAGES_LINK_TBL." WHERE f_id='$f_id' AND g_id='".$this -> g_id."'"; list($count) = $MAIN_DB -> fetch_array( $MAIN_DB -> query($sql) ); if ( $count>0 ){ return TRUE ; } return FALSE; } public function check_right_block($b_id){ global $MAIN_DB; $b_id = intval($b_id); if ( empty($b_id) ){ sys_error(ERROR_500); } $sql = " SELECT COUNT(*) FROM ".MAIN_GRP_BLK_LINK_TBL." WHERE b_id = '$b_id' AND g_id ='".$this -> group()."'"; list( $access ) = $MAIN_DB -> fetch_array( $MAIN_DB-> query($sql) ); if ( $access>0 ){ return TRUE; } return FALSE; } public function is_admin(){ if ( $this -> get('g_type')=='admin' ){ return TRUE; }else{ return FALSE; } } public function is_user(){ if ( $this -> get('g_type')=='user' ){ return TRUE; }else{ return FALSE; } } // проверяет логин на соответствие формату, возвращает ошибку или false static function error_login($l){ if ( strlen($l)<3 ){ return 'Ошибка: логин должен содержать не менее 3-х символов'; } if ( strlen($l)>20 ){ return 'Ошибка: логин должен содержать не более 20-ти символов'; } if ( preg_match('#[^.0-9-_a-z]#iUs',$l) ){ return 'Ошибка: логин "'.$l.'" содержит запрещённые символы'; } return false; } static function exists_login($l,$id=0){ $u = self::query('u'); //$u -> set_debug(1); $u -> where_login($l); $u -> where_not_id($id); $u -> get('COUNT(*)'); list($count) = $u -> row(); if ( $count>0 ){ return true; } return false; } static function error_pass($l){ if ( strlen($l)<3 || strlen($l)>20 ){ return U_ERROR_BAD_PASS; } return false; } static function error_email($l){ if ( !sys_is_mail($l) ){ return U_ERROR_BAD_EMAIL; } return false; } static function exists_email($v,$id=0){ global $MAIN_DB; $u = self::query('u'); $u -> where_email($v); $u -> where_not_id($id); //$u -> set_debug(1); $u -> get('COUNT(*)'); list($count) = $u -> row(); if ( $count>0 ){ return true; } return false; } // создаём объект для гостя static function create_guest(){ global $MAIN_PAGE; $row = array( 'u_id' => false, 'g_id' => 3, 'g_type' => 'guest', 'u_login' => $MAIN_PAGE -> config("sys_guest_name"), 'u_lang' => 'ru' ); $u = new self( 0,$row ); return $u; } // создаём объект пользователя по переданному id static function load_id($id){ $u = self::query('u'); $u -> include_groups('g','g.g_type,g.g_name'); if ( !$u -> where_id($id) ){ return FALSE; } if ( !$u -> get('u.*') ){ return FALSE; } if ( $u -> get_count_rows()==0 ){ return FALSE; } return new self( $id,$u -> row() ); } static function create(){ return new self( 0,array('u_id'=>0) ); } // создаём объект пользователя по переданному логину static function load_login($l){ $u = self::query('u'); $u -> include_groups('g','g.g_type,g.g_name'); if ( !$u -> where_login($l) ){ return FALSE; } $u -> get('u.*'); if ( $u -> get_count_rows()==0 ){ return FALSE; } return new self( $u->u_id,$u -> row() ); } // создаём объект пользователя по переданному логину static function load_email($l){ $u = self::query('u'); //$u -> set_debug(1); $u -> include_groups('g','g.g_type,g.g_name'); if ( !$u -> where_email($l) ){ return FALSE; } $u -> get('u.*'); if ( $u -> get_count_rows()==0 ){ return FALSE; } return new self( $u->u_id,$u -> row() ); } /*** авторизация ***/ static function auth(){ global $MAIN_PAGE; // просто гость if ( empty($_COOKIE[ $MAIN_PAGE -> config('sys_cookie_name') ]) ){ return self::create_guest(); } $cookie = unserialize(stripslashes($_COOKIE[$MAIN_PAGE -> config('sys_cookie_name')])); // кука имеет неправильный формат if ( !is_array($cookie) OR sizeof($cookie)<>3 ){ return self::create_guest(); } list($key,$u_id,$save) = $cookie; $save = intval($save); if ( empty($u_id) || empty($key) ){ return self::create_guest(); } $u = self::load_id($u_id); if ( $u===FALSE || $key!= self::make_pass( $u -> pass() ) ){ return self::create_guest(); } if ( $u -> active()!=1 ){ return self::create_guest(); } $u -> user_session($save); return $u; } static public function make_pass($pass){ return md5($pass.MAIN_CLOSE_KEY); } static function logout(){ global $MAIN_PAGE; setcookie($MAIN_PAGE -> config('sys_cookie_name'), false, 0, '/', '', 0); setcookie('is_admin', 0, $time_live_cookie, '/', '', 0); setcookie('u_id', 0, $time_live_cookie, '/', '', 0); setcookie('u_login', 0, $time_live_cookie, '/', '', 0); } static function groups(){ global $MAIN_DB; $sql = " SELECT g_id,g_name FROM ".MAIN_GROUP_TBL; $res = $MAIN_DB -> query($sql); $result = array(); while( $row = $MAIN_DB -> fetch_array($res) ){ $result[$row['g_id']] = $row['g_name']; } return $result; } static function getGroup($u) { if ( empty($u) ) { return 3; } return $u -> group(); } static function getGroupType($u) { $group_id = self::getGroup($u); $array = array('1'=>'admin','6'=>'moderator','3'=>'guest','4'=>'user','5'=>'user'); return $array[$group_id]; } } // end class ?>