* @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.'/modules/users/inc/url.php'); include_once(MAIN_SOURCE_PATH.'/modules/users/lang/'.MAIN_LANG.'/lang.php'); // класс запросов к таблице пользователей class u_query extends query{ //private $last_error = false; public function __construct($alias='u'){ global $MAIN_DB; $this -> set_table( MAIN_USERS_TBL ); $this -> set_alias($alias); include_once(MAIN_SOURCE_PATH.'/modules/users/cache/config.php'); } public function include_groups($alias,$cols=''){ $this -> include_table( MAIN_GROUP_TBL ,$alias,'g_id',$cols ); } public function include_banned($alias,$cols=''){ global $MAIN_DB; $this -> include_table( $MAIN_DB -> prefix('users_ban') ,$alias,'u_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; } return $this -> set_where( $this -> alias.'.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 where_ban_end($v){ global $MAIN_DB; $v = intval($v); $a = $this -> get_alias( $MAIN_DB-> prefix("users_ban") ); return $this -> set_anothe_where( $a.'.b_time_end <= '.$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); } static function profile_url($v){ return sys_url(URL_USERS_PROFILE,$v); } // логин на входе protected 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; } protected function forget_url($v,$row){ return MAIN_URL.'/?p_name=users_profile&act=forget_end&code='.$v.'&id='.$row['u_id']; } // на основе количества очков, считаем ранг protected function rank_img($v){ global $MAIN_PAGE,$MAIN_DB; /* // рефакторинг $MAIN_DB -> set_prefix('lc'); // ---- // получаем изображение $ranks = $MAIN_PAGE -> cache( $MAIN_DB -> prefix('users_rank') ); foreach( $ranks as $r ){ if ( $v>=$r['r_points']){ $r_image = $r['r_image']; continue; } } // у ранга всегда должно быть изображение if ( !empty($r_image) ){ return MAIN_RF_URL.'/source/modules/ajax/tmp/'.$r_image; }else{ sys_error(500); }*/ } protected function rank_name($v){ /*if ( !empty($v) ){ return '/source/modules/ajax/tmp/crop_'.$v; }else{ return '/source/tmpl/img/no_cover.jpg'; }*/ } /*function get_rank_img($points){ global $rank; $points = intval($points); $tmp = array(); foreach( $rank AS $array ){ } return $tmp[sizeof($tmp)-1]['r_image']; }*/ protected function user_type($v){ if ($v==1){ return U_USERS_MEMBER_TYPE; }elseif( $v==2 ){ return U_USERS_ORG_TYPE; }else{ sys_error(500); } } protected function u_time_reg($v){ return date('d.m.Y',$v); } protected function row_class($v){ return !empty($v) ? 'body2' : 'body_red'; } protected function unconfirm($v){ return ($v==0) ? true : false; } protected function confirm($v){ return ($v==1) ? true : false; } protected function delete($v){ return ($v==2) ? true : false; } protected function banned($v){ return ($v==3) ? true : false; } protected function ban_time_end($v){ if (empty($v) ){ return false; } return date('d.m.Y',$v); } protected function ban_time_add($v){ if (empty($v) ){ $v = MAIN_TIME; } return date('d.m.Y',$v); } } class users{ private $info = array(); private $last_error = false; private $debug = false; //private $main_key = false; private $set_info = array(); public function __construct( $array=array() ){ $this -> info = $array; //$this -> main_key = $array['u_id']; } // обновление сессии пользователя public function user_session($save){ global $MAIN_PAGE; if ( false===$this -> id()){ return false; } $s_data = serialize(array( users::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); } /*** set,get - это общие функции доступа к свойствам объекта пользователя. Использовать лучше только внутри модуля users ***/ public function get($k){ if ( isset($this -> info[$k]) ){ return $this -> info[$k]; } sys_error( '500', sprintf(U_EMPTY_VAR,$k) ); } public function set($k,$v){ if ( method_exists($this,'set_'.$k) ){ $f = 'set_'.$k; return $this -> $f($v); }else{ $this -> set_info[$k] = $v; return TRUE; } } /*** SET - функции. Это уникальные обработчики для значений заносимых в базу данных ***/ public function set_u_login($v){ $e = users::error_login($v); if ( !empty($e) ){ throw new Exception($e); } if ( $this -> id()==0 && users::exists_login($v,$this -> id() ) ){ throw new Exception(U_EXISTS_LOGIN); } $this -> set_info['u_login']=$v; return TRUE; } public function set_u_spam($v){ $v = !empty($v) ? 1 : 0; $this -> set_info['u_spam']=$v; return TRUE; } public function set_u_pass($v){ if ( empty($v) && $this -> id()!=0 ){ return false; } $e = users::error_pass($v); if ( !empty($e) ){ throw new Exception($e); //$this -> make_error($e); //return FALSE; } $this -> set_info['u_pass']=users::make_pass($v); return TRUE; } public function set_u_pass_re($v){ if ( empty($this -> set_info['u_pass']) && empty($v) && $this -> id()!=0 ){ return false; } if ( $this -> set_info['u_pass']!=users::make_pass($v) ){ throw new Exception(U_BAD_PASS_RE); //$this -> make_error(U_BAD_PASS_RE); //return FALSE; } return TRUE; } public function set_u_email($v){ $e = users::error_email($v); if ( !empty($e) ){ throw new Exception($e); //$this -> make_error($e); //return FALSE; } if ( $this -> email()==0 && users::exists_email($v,$this -> id() ) ){ throw new Exception(U_EXISTS_EMAIL); //$this -> make_error(U_EXISTS_EMAIL); //return FALSE; } $this -> set_info['u_email']=$v; return TRUE; } public function set_u_name($v){ if ( empty($v) ){ throw new Exception(U_ERROR_EMPTY_NAME); //$this -> make_error(U_ERROR_EMPTY_NAME); //return FALSE; } $this -> set_info['u_name']=$v; return TRUE; } public function set_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); //$this -> make_error(U_ERROR_FALSE_DOB); //return false; } $this -> set_info['u_dob']=$v; return true; } public function set_g_type($v){ $array = array('admin','user','guest'); if ( !in_array($v,$array) ){ sys_error( '500'); } $this -> set_info['g_type']=$v; return TRUE; } public function set_g_id($v){ $v = intval($v); if ( empty($v) ){ throw new Exception(U_ERROR_FALSE_GROUP); //$this -> make_error(U_ERROR_FALSE_GROUP); //return false; } $this -> set_info['g_id']=$v; return TRUE; } public function set_g_name($v){ if ( empty($v) ){ sys_error( '500'); } $this -> set_info['g_name']=$v; return TRUE; } public function set_u_points($v){ $v = intval($v); if ( empty($v) ){ return false; } if ( $v>=0){ $this -> set_info['u_points']=$v; return TRUE; } throw new Exception(U_ERROR_FALSE_POINTS); } public function set_active($v){ $v = !empty($v) ? '1' : 0; $this -> set_info['u_active']=$v; return TRUE; } public function set_delete($v){ if ( $v ==2 ){ $this -> set_info['u_active']=2; return TRUE; } return false; } public function set_u_avatar($v){ if ( empty($v) ){ $this -> set_info['u_avatar']=$v; return TRUE; } if ( !preg_match('#^([x_0-9]*)\.jpg|jpeg|gif|png$#iUs',$v) ){ return false; } $this -> set_info['u_avatar']=$v; return TRUE; } /*** GET - функции-алисы,их нужно использовать вне класса и модуля, чтобы снизить процент изменяющегося кода при переходе от одного проекта к другому ***/ public function active(){ return $this -> info['u_active']; } public function id(){ return $this -> info['u_id']; } public function lang(){ if ( empty($_COOKIE['lang']) ){ return $this -> info['u_lang']; }elseif( sys_check_lang($_COOKIE['lang']) ){ return $_COOKIE['lang']; }else{ return MAIN_LANG; } } public function group(){ return $this -> info['g_id']; } public function login(){ return $this -> info['u_login']; } public function email(){ return $this -> info['u_email']; } public function name(){ return $this -> info['u_name']; } public function act_code(){ return $this -> info['u_act_code']; } public function pass(){ return $this -> info['u_pass']; } public function count_posts(){ return $this -> info['u_count_posts']; } public function count_blog_posts(){ return $this -> info['u_count_blog_posts']; } public function points(){ return $this -> info['u_points']; } public function avatar(){ return $this -> info['u_avatar']; } public function avatar_src(){ if ( empty($this -> info['u_avatar']) ){ return false; } return '/media/users/ava/'.$this -> info['u_avatar']; } /*** проверка прав пользователей на дуступ к страницам и блокам ***/ 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 -> group()."'"; 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; } } public function is_ban(){ if ( $this -> get('u_ban')==1 ){ return TRUE; }else{ return FALSE; } } public function error(){ return $this -> last_error; } // добавляем в таблицу новую запись public function insert(){ global $MAIN_DB; // при инициализации значений произошла ошибка if ( false!==$this -> error() ){ return false; } if ( sizeof($this -> set_info)==0 ){ sys_error( '500',U_ARRAY_EMPTY); } // так как запись новая, нужно проверить уникальные ключи на повторение /*if ( users::exists_login($this -> info['u_login']) ){ $this -> make_error(ERROR_MESSAGE,U_EXISTS_LOGIN); return false; } */ /* if ( users::exists_email($this -> info['u_email']) ){ $this -> make_error(ERROR_MESSAGE,U_EXISTS_EMAIL); return false; } */ // формируем и выполняем запрос $sql = array(); foreach( $this -> set_info as $k=>$v ){ $sql[]="`$k`='".sys_in_sql($v)."'"; } $sql = "INSERT INTO ".$MAIN_DB -> prefix("users")." SET ".implode(',',$sql).""; if ( !empty($this -> debug ) ){ die($sql); } $MAIN_DB -> query($sql); foreach( $this -> set_info as $k=>$v ){ $this -> info[$k]=$v; } $id = $MAIN_DB -> insert_id(); $this -> info['u_id']=$id; return $id; } public function update(){ global $MAIN_DB; /*if ( empty($id) ){ $this -> make_error(ERROR_MESSAGE,U_ARRAY_EMPTY); return false; }*/ // при инициализации значений произошла ошибка if ( false!==$this -> error() ){ return false; } if ( sizeof($this -> set_info)==0 ){ sys_error( '500',U_ARRAY_EMPTY); } $sql = array(); foreach( $this -> set_info as $k=>$v ){ $sql[]="`$k`='".sys_in_sql($v)."'"; } $sql = "UPDATE ".$MAIN_DB -> prefix("users")." SET ".implode(',',$sql)." WHERE u_id='".$this -> id()."'"; if ( !empty($this -> debug ) ){ die($sql); } $MAIN_DB -> query($sql); foreach( $this -> set_info as $k=>$v ){ $this -> info[$k]=$v; } return $this -> id(); } public function set_debug($f){ $this -> debug = $f; } /**** * удаление пользователей из системы * @project Poremontu * * ****/ public function delete( ){ global $MAIN_DB; $id = $this -> id(); if ( empty($id) ){ sys_error(ERROR_500,E_EMPTY_ID); } //$sql = "DELETE FROM ".MAIN_USERS_TBL." WHERE u_id='$id'"; //$MAIN_DB -> query($sql); //$sql = "DELETE FROM ".$MAIN_DB -> prefix("users_points_log")." WHERE u_id='$id'"; //$MAIN_DB -> query($sql); $sql = "DELETE FROM ".$MAIN_DB -> prefix("users")." WHERE u_id='$id'"; $MAIN_DB -> query($sql); return TRUE; } public function undelete( ){ global $MAIN_DB; $id = $this -> id(); if ( empty($id) ){ sys_error(ERROR_500,E_EMPTY_ID); } //$sql = "DELETE FROM ".MAIN_USERS_TBL." WHERE u_id='$id'"; //$MAIN_DB -> query($sql); //$sql = "DELETE FROM ".$MAIN_DB -> prefix("users_points_log")." WHERE u_id='$id'"; //$MAIN_DB -> query($sql); //$sql = "DELETE FROM ".$MAIN_DB -> prefix("users_ban")." WHERE u_id='$id'"; //$MAIN_DB -> query($sql); // пользователь восстановлен $this -> set('u_active',1); $this -> update(); return TRUE; } /**** * бан пользователя * @project Poremontu * * ****/ public function banned($time_begin,$time_end,$reason=''){ global $MAIN_DB; $time_begin = explode('.',$time_begin); if ( sizeof($time_begin)!=3 ){ $this -> make_error(M_USERS_FALSE_DATE_BEGIN); return false; } $time_begin = mktime(0,0,0,$time_begin[1],$time_begin[0],$time_begin[2]); $time_end = explode('.',$time_end); if ( empty($time_end) || sizeof($time_end)!=3 ){ $this -> make_error(M_USERS_FALSE_DATE_END); return false; } $time_end = mktime(0,0,0,$time_end[1],$time_end[0],$time_end[2]); $sql = "DELETE FROM ".$MAIN_DB -> prefix("users_ban")." WHERE u_id='".$this -> id()."'"; $MAIN_DB -> query($sql); $sql = "INSERT INTO ".$MAIN_DB -> prefix("users_ban")." SET u_id='".$this -> id()."', b_time_add = ".$time_begin.", b_time_end = ".$time_end.", b_reason= '".sys_in_sql($reason)."'"; $MAIN_DB -> query($sql); $this -> set('u_active',3); if ( !$this -> update() ){ return false; } // извещение пользователя, что он забанен return true; } /**** * удаляем бан пользователя * @project Poremontu * * ****/ public function unbanned(){ global $MAIN_DB; $sql = "DELETE FROM ".$MAIN_DB -> prefix("users_ban")." WHERE u_id='".$this -> id()."'"; $MAIN_DB -> query($sql); $this -> set('u_active',1); if ( !$this -> update() ){ return false; } // извещение пользователя, что он забанен return true; } // проверяет логин на соответствие формату, возвращает ошибку или false static function error_login($l){ if ( strlen($l)<3 || strlen($l)>20 ){ return 'Ошибка: логин "'.($l).'" не соответствует разрешённому формату'; } if ( preg_match('#[^.0-9-_a-z]#iUs',$l) ){ return 'Ошибка: логин "'.$l.'" содержит запрещённые символы'; } return false; } static function exists_login($l,$id=0){ global $MAIN_DB; $u = new u_query('u'); $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 = new u_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 users( $row ); return $u; } // создаём объект пользователя по переданному id static function load_id($id){ $u = new u_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 users( $u -> row() ); } static function create(){ return new users( array('u_id'=>0) ); } // создаём объект пользователя по переданному логину static function load_login($l){ // формируем запрос $u = new u_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 users( $u -> row() ); } // создаём объект пользователя по переданному логину static function load_email($l){ // формируем запрос $u = new u_query('u'); // включаем в запрос информацию о группе пользователя $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 users( $u -> row() ); } /*** авторизация ***/ static function auth(){ global $MAIN_PAGE; // просто гость if ( empty($_COOKIE[ $MAIN_PAGE -> config('sys_cookie_name') ]) ){ return users::create_guest(); } $cookie = unserialize(stripslashes($_COOKIE[$MAIN_PAGE -> config('sys_cookie_name')])); // кука имеет неправильный формат if ( !is_array($cookie) OR sizeof($cookie)<>3 ){ return users::create_guest(); } list($key,$u_id,$save) = $cookie; $save = intval($save); if ( empty($u_id) || empty($key) ){ return users::create_guest(); } $u = users::load_id($u_id); if ( $u===FALSE || $key!= users::make_pass( $u -> pass() ) ){ return users::create_guest(); } if ( $u -> active()!=1 ){ return users::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; } private function make_error($msg){ $this -> last_error = $msg; } static function control_points($uid,$type){ global $MAIN_PAGE,$MAIN_DB; include_once(MAIN_SOURCE_PATH.'/modules/users/cache/points.php'); include_once(MAIN_SOURCE_PATH.'/modules/users/inc/class.users.php'); $points = $MAIN_PAGE -> config($type); $u = users::load_id($uid); if ( false===$u ){ //sys_error(ERROR_500); return true; } $u -> set( 'u_points', $points + $u -> points() ); $u -> update(); $sql = " INSERT INTO ".$MAIN_DB -> prefix('users_points_log')." SET `type`='".$type."' , u_id='".$uid."', time='".MAIN_TIME."', points='".$main_points[$type]."'"; $MAIN_DB -> query($sql); return true; } // удаляем просроченные баны static function clear_ban(){ global $MAIN_DB; $u = new u_query('u'); $u -> include_banned('b','b.u_id'); $u -> where_ban_end( MAIN_TIME ); //$u -> set_debug(1); $u -> get(false,false); while( list($u_id) = $u -> row() ){ $user = users::load_id($u_id); $user -> set('u_active',1); $user -> update(); $sql = "DELETE FROM ".$MAIN_DB -> prefix("users_ban")." WHERE u_id='$u_id'"; $MAIN_DB -> query($sql); } return true; } } // end class user ?>