Пример #1
0
 function registration($arr)
 {
     $login = !empty($arr['login']) ? $arr['login'] : false;
     $pas = !empty($arr['pas']) ? $arr['pas'] : false;
     $email = !empty($arr['email']) ? $arr['email'] : '';
     //Валидация данных--------
     if ($email and !Func::valid_email($email)) {
         throw new Exception('Не верный адре электронной почты.');
     }
     if (mb_strlen($login, 'utf-8') < 3) {
         throw new Exception('Длина логина должна быть не менее 3х символов.');
     }
     if (mb_strlen($pas, 'utf-8') < 5) {
         throw new Exception('Длина пароля должна быть не менее 5и символов.');
     }
     if (!Func::valid_login($login)) {
         throw new Exception('Запрещённые символы в поле Login! Разрешены только буквы русского и латинского алфавита и цифры.');
     }
     //-------------------------
     $res = $this->db->prepare("SELECT id FROM users WHERE login=?;");
     $res->execute(array($login));
     if ($row = $res->fetch()) {
         throw new Exception("Пользователь с логином {$login} уже зарегистрирован. Выберите другой логин.");
     }
     if ($email) {
         $res = $this->db->prepare("SELECT id FROM users WHERE email=?;");
         $res->execute(array($email));
         if ($row = $res->fetch()) {
             throw new Exception('Пользователь с таким Email уже зарегистрирован.');
         }
     }
     //Удаляем не подтверждённые аккаунты, старше суток
     $this->db->query("DELETE FROM tmp_users WHERE time<UNIX_TIMESTAMP()-3600*24;");
     $res = $this->db->prepare("SELECT login FROM tmp_users WHERE login=?;");
     $res->execute(array($login));
     if ($row = $res->fetch()) {
         throw new Exception("Пользователь с логином {$login} ожидает подтверждение регистрации. Выберите другой логин.");
     }
     if ($email) {
         $res = $this->db->prepare("SELECT login FROM tmp_users WHERE email=?;");
         $res->execute(array($email));
         if ($row = $res->fetch()) {
             throw new Exception('Пользователь с таким Email ожидает подтверждение регистрации.');
         }
     }
     //Шифруем пароль
     $md5pas = md5('cms' . md5($pas));
     //Если требуется подтверждение $email--
     if ($this->conf['reg']['email_must']) {
         if (!$email) {
             throw new Exception('Необходим Email');
         } else {
             $code = Func::rand_string(10);
             $res = $this->db->prepare("INSERT INTO tmp_users (login,pas,email,code,time) VALUES (?,?,?,?,UNIX_TIMESTAMP());");
             if (!$res->execute(array($login, $md5pas, $email, $code))) {
                 throw new Exception($this->db->errorInfo());
             }
             //Высылаем код для подтверждения email
             $from_name = 'Администрация ' . $_SERVER['HTTP_HOST'];
             $from_email = 'admin@' . $_SERVER['HTTP_HOST'];
             $mail_subject = 'Подтверждение регистрации';
             $mail_text = 'Для подтверждения регистрации на сайте ' . H . ' перейдите по следующей ссылке:' . "\n" . H . '/login/email_confirm/' . $code;
             Func::send_mail($from_name, $from_email, $login, $email, $mail_subject, $mail_text);
             return array('pas' => $md5pas, 'email' => $email, 'login' => $login);
         }
     }
     //-------------------------------------
     $res = $this->db->prepare("INSERT INTO users (login, pas, email,reg_time) VALUES (?,?,?,UNIX_TIMESTAMP());");
     if (!$res->execute(array($login, $md5pas, $email))) {
         throw new Exception($this->db->errorInfo());
     }
     $id = $this->db->lastInsertId();
     return array('id' => $id, 'pas' => $md5pas, 'email' => $email, 'login' => $login);
 }
Пример #2
0
 function registration()
 {
     if ($this->user['id']) {
         $this->error('Вы уже зарегистрированы');
     }
     $captcha = new Captcha();
     $this->des->set('captcha', $captcha);
     if (!$this->conf['reg']['on']) {
         $this->error('Регистрация закрыта');
     }
     //Ajax Проверка занятости логина
     if (isset($_POST['check_login'])) {
         $this->des->auto_head = false;
         //Длина логина
         if (mb_strlen($_POST['check_login'], 'UTF-8') < 3 or mb_strlen($_POST['check_login'], 'UTF-8') > 10) {
             $str = '<span class="red">Длина от 3х до 10и символов.</span>';
         } else {
             $res = $this->db->prepare("SELECT login FROM users WHERE login=?;");
             $res->execute(array($_POST['check_login']));
             if ($row = $res->fetch()) {
                 $str = '<span class="red">Уже занят!</span>';
             } else {
                 //валидация логина
                 if (!Func::valid_login($_POST['check_login'])) {
                     $str = '<span class="red">Запрещённые символы</span>';
                 } else {
                     $str = '<span class="green">Свободен</span>';
                 }
             }
         }
         echo "\$('#check-login').html('{$str}');";
         exit;
     }
     //Обработка формы------
     if (isset($_POST['login'])) {
         $error = array();
         $this->des->set('title', 'Регистрация');
         $_POST['login'] = trim($_POST['login']);
         $_POST['pas'] = trim($_POST['pas']);
         //Сохраняем поля формы
         $_SESSION['reg']['login'] = $_POST['login'];
         $_SESSION['reg']['email'] = $_POST['email'];
         $_SESSION['reg']['pas'] = $_POST['pas'];
         $_SESSION['reg']['repas'] = $_POST['repas'];
         if ($this->conf['reg']['captcha']) {
             if (!$captcha->is_access($_POST['captcha'])) {
                 $error[] = 'Не верно введены символы с картинки';
             }
         }
         //Сверка паролей
         if ($_POST['pas'] != $_POST['repas']) {
             $error[] = 'Пароли не совпадают';
         }
         //Длина пароля
         if (mb_strlen($_POST['pas'], 'utf-8') < 5) {
             $error[] = 'Длина пароля должна быть не менее 5и символов.';
         }
         //Длина логина
         if (mb_strlen($_POST['login'], 'utf-8') < 3) {
             $error[] = 'Длина логина должна быть не менее 3х символов.';
         }
         //валидация логина
         if (!Func::valid_login($_POST['login'])) {
             $error[] = 'Запрещённые символы в поле Login! Разрешены только буквы русского и латинского алфавита и цифры.';
         }
         if ($this->conf['reg']['email']) {
             if ($this->conf['reg']['email_must']) {
                 if (empty($_POST['email'])) {
                     $error[] = 'Поле email - обязательно для заполнения';
                 }
             }
             if (!empty($_POST['email']) and !Func::valid_email($_POST['email'])) {
                 $error[] = 'Не верно заполнено поле Email.';
             }
         }
         //Если нет ошибок, регистрация
         if (!$error) {
             try {
                 $reg_arr = SiteWrite::me()->registration($_POST);
                 if ($this->conf['reg']['email_must']) {
                     $this->loc(H . '/login/email_confirm');
                 }
                 //Авторизируем пользователя
                 $_SESSION['user_id'] = $reg_arr['id'];
                 //Пишем куки-----
                 setcookie('id', $reg_arr['id'], time() + 3600 * 24 * 30, '/');
                 setcookie('p', $reg_arr['pas'], time() + 3600 * 24 * 30, '/');
                 //--------------
                 $this->loc(H . '/login/success');
             } catch (Exception $e) {
                 $error[] = $e->getMessage();
             }
         }
         //Заполняем сохранённые поля формы
         if (!empty($_SESSION['reg'])) {
             foreach ($_SESSION['reg'] as $key => $val) {
                 $this->des->set($key, $val);
             }
         }
         //Вывод ошибок
         if ($error) {
             $this->error($error, false);
         }
     }
     //---------------------
     $this->des->set('registration', true);
     $this->des->display('login');
 }