public function registration($type_wizard = step_wizard_registration::TYPE_WIZARD_EMP) { require_once $_SERVER['DOCUMENT_ROOT'] . "/classes/captcha.php"; $action = __paramInit('string', null, 'action'); if ($this->status == step_wizard::STATUS_CONFIRM) { if ($_SESSION['email'] == 0) { require_once $_SERVER['DOCUMENT_ROOT'] . "/classes/users.php"; $user = new users(); $email = $user->GetField(wizard::getUserIDReg(), $error, "email"); $_SESSION['email'] = $email; } if ($action == registration::ACTION_SEND_MAIL) { $send = registration::actionSendMail(false); if ($send) { header("Location: /wizard/registration/"); exit; } } } $type_user = $type_wizard; if ($action == 'registration' && $this->status == 0) { $error = array(); if (!$_SESSION["regform_captcha_entered"]) { session_start(); $captchanum = __paramInit('string', null, 'captchanum'); $num = __paramInit('string', null, 'rndnum'); $_SESSION['w_reg_captcha_num'] = $captchanum; $captcha = new captcha($captchanum); if (!$captcha->checkNumber($num)) { $error['captcha'] = 'Неверный код. Попробуйте еще раз'; unset($_SESSION['w_reg_captcha_num']); } } if ($type_wizard == step_wizard_registration::TYPE_WIZARD_EMP) { require_once $_SERVER['DOCUMENT_ROOT'] . "/classes/employer.php"; } else { require_once $_SERVER['DOCUMENT_ROOT'] . "/classes/freelancer.php"; } $login = trim(__paramInit('string', null, 'login')); $email = trim(__paramInit('string', null, 'email')); $agree = trim(__paramInit('string', null, 'agree')); $phone = trim(__paramInit('string', null, 'phone')); $smscode = trim(__paramInit('string', null, 'smscode')); // пароль берем напрямую из $_POST, а то __paramInit режет спецсимволы (пароль хешируется - SQL инъекция невозможна) $passwd = $_POST['password']; if (!$agree) { $error['agree'] = 'Прочтите и согласитесь с правилами'; } if ($passwd == '') { $error['pwd'] = 'Введите пароль'; } if (!preg_match("/^[a-zA-Z0-9]+[-a-zA-Z0-9_]{2,}\$/", $login)) { $error['login'] = '******'; } if (in_array(strtolower($login), $GLOBALS['disallowUserLogins'])) { $error['login'] = '******'; } if (!is_email($email)) { $error['email'] = 'Поле заполнено некорректно'; } if ($smscode != $_SESSION["smsCode"]) { $error['smscode'] = 'Код не совпал'; } if ($phone != $_SESSION["reg_phone"]) { $error['phone'] = 'Вы вводили другой номер при запросе кода'; } $phone = preg_replace("#^\\+#", "", $_SESSION["reg_phone"]); if (empty($error['login'])) { $sql = "SELECT uid FROM users WHERE lower(login) = ?"; if ($this->_db->val($sql, strtolower($login))) { $error['login'] = '******'; } } if (empty($error['email']) && empty($error['captcha'])) { require_once $_SERVER['DOCUMENT_ROOT'] . "/classes/temp_email.php"; if (temp_email::isTempEmail($email)) { $error['email'] = 'К сожалению, регистрация аккаунта на указанный адрес электронной почты невозможна. Пожалуйста, для регистрации воспользуйтесь почтовым адресом другого домена'; } else { $sql = "SELECT uid FROM users WHERE lower(email) = ?"; if ($this->_db->val($sql, strtolower($email))) { $error['email'] = 'Указанная вами электронная почта уже зарегистрирована. Авторизуйтесь на сайте или укажите другую электронную почту.'; } } } if (count($error) == 0) { if ($type_wizard == step_wizard_registration::TYPE_WIZARD_EMP) { $newuser = new employer(); } else { $newuser = new freelancer(); } $newuser->checked_name = false; if ($type_wizard == step_wizard_registration::TYPE_WIZARD_EMP) { $newuser->role = 1; } else { $newuser->role = 0; } $newuser->login = substr($login, 0, 15); $newuser->email = substr($email, 0, 64); $newuser->passwd = substr($passwd, 0, 24); $id = $newuser->Create($rerror, $error); if ($id && !$error) { require_once $_SERVER['DOCUMENT_ROOT'] . "/classes/activate_code.php"; $this->parent->saveActionWizard($this, step_wizard::STATUS_CONFIRM); $this->parent->bindUserIDReg($id); unset($_SESSION['ref_uri']); require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/smail.php'; $smail = new smail(); $bSuspect = users::isSuspiciousUser($id, $newuser->login, '', $newuser->uname, '', $newuser->usurname, ''); $sPasswd = $bSuspect ? $newuser->passwd : ''; // чтобы из админки можно было выслать $smail->NewUser $code = activate_code::Create($id, $newuser->login, $sPasswd, $error); if (!$bSuspect) { $_SESSION['suspect'] = false; // юзер не подозрительный - сразу отпавляем юзеру письмо с кодом активации $smail->NewUser($newuser->login, false, $code, $this->getWizardUserID(), $newuser->role ? 'emp' : 'frl'); } else { $_SESSION['suspect'] = true; // отправляем уведомление админу о том, что зарегистрировался подозрительный юзер // если админ его одобрит - то письмо с кодом активации уйдет из админки $smail->adminNewSuspectUser($newuser->login, $newuser->uname, $newuser->usurname); } //Записываем подтвержденный номер телефона в финансы require_once $_SERVER['DOCUMENT_ROOT'] . "/classes/sms_gate.php"; $phone = '+' . preg_replace("#^\\+#", "", $_SESSION["reg_phone"]); unset($_SESSION["regform_captcha_entered"]); sms_gate::saveSmsInfo($phone, $_SESSION["reg_sms_isnn"], $_SESSION["smsCode"], $_SESION["reg_sms_date_send"], $id); // стираем куку, чтобы показался блок "Вы успешно зарегистрировались" setcookie('master_auth', "", time() - 3600, '/'); // Серый список IP ---------------------- require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/gray_ip.php'; $aGrayList = gray_ip::getGrayListByRegIp(getRemoteIP()); if ($aGrayList) { // есть записи в списке первичных IP gray_ip::addSecondaryIp($id, $newuser->login, $newuser->role, $aGrayList); } //--------------------------------------- $_SESSION['email'] = $newuser->email; header("Location: /wizard/registration/"); exit; } } } elseif ($action == 'authorization') { $auth_error = $this->authorization($auth_login); } include $_SERVER['DOCUMENT_ROOT'] . "/wizard/registration/steps/tpl.step.reg.php"; }
if (!is_email($email)) { $error_flag = 1; $alert[3] = "Поле заполнено некорректно"; } $user = new freelancer(); $user->GetUser($login); $sOldName = $user->uname; $sOldSurname = $user->usurname; if ($email != $user->email) { $ch_mail = 1; } if ($user->CheckEmail($email)) { $error_flag = 1; $alert[3] = "Извините, такой электронный ящик уже существует"; } if (temp_email::isTempEmail($email)) { $error_flag = 1; $alert[3] = "Извините, но почтовые адреса с этого домена запрещены к регистрации"; } $frl = new freelancer(); $err = $frl->UpdateMain($uid, $name, $surname, $user->email, $oldpwd, $pname, $error_flag); if (!$err && !$error_flag) { // все что нужно после успешного обновления: if (users::isSuspiciousUser($uid, $login, $login, $name, $sOldName, $surname, $sOldSurname)) { require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/smail.php'; $smail = new smail(); $smail->adminNewSuspectUser($_SESSION['login'], $name, $surname); } // галки поля settings $frl->updateMainSettings($uid, $question_button_hide, $promo_block_hide, $direct_links); $frl->setPromoBlockShowCookie($uid, $promo_block_hide);
public function validate($name, $value, $phone_is_set = false) { global $DB; switch ($name) { case 'agree': if ($value != 1) { $this->error[$name] = 'Прочтите и согласитесь с правилами'; } break; case 'country': if ($value <= 0) { $this->error[$name] = 'Выберите страну'; } break; case 'city': if ($value <= 0) { $this->error[$name] = 'Выберите город'; } break; case 'birthday': if (!$value) { $this->error[$name] = "Заполните дату дня рождения"; $this->errno[$name] = 1; } break; case 'sex': if ($value === null) { // $this->error[$name] = 'Выберите пол'; } break; case 'uname': case 'usurname': if (!$value) { $this->error[$name] = "Поле заполнено некорректно"; $this->errno[$name] = 1; } if (!preg_match("/^[-a-zA-Zа-яёА-ЯЁ]+\$/i", $value)) { $this->error[$name] = "Поле заполнено некорректно"; $this->errno[$name] = 2; } break; case 'password': if ($value == '') { $this->error[$name] = 'Введите пароль'; $this->errno[$name] = 1; } else { if (strlen($value) > 24) { $this->error[$name] = 'Максимальная длина пароля 24 символа'; $this->errno[$name] = 2; } else { if (strlen($value) < 6) { $this->error[$name] = 'Минимальная длина пароля 6 символов'; $this->errno[$name] = 3; } else { if (strlen(preg_replace("#[a-zA-Z\\d\\!\\@\\#\$\\%\\^\\&\\*\\(\\)\\_\\+\\-\\=\\;\\,\\.\\/\\?\\[\\]\\{\\}]#", "", $value)) != 0) { $this->error[$name] = 'Поле заполнено некорректно'; $this->errno[$name] = 4; } } } } break; case 'login': if (!preg_match("/^[a-zA-Z0-9]+[-a-zA-Z0-9_]{2,}\$/", $value)) { $this->error[$name] = 'От 3 до 15 символов. Может содержать латинские буквы, цифры, подчёркивание (_) и дефис (-)'; $this->errno[$name] = 1; } if (in_array(strtolower($value), $GLOBALS['disallowUserLogins'])) { $this->error[$name] = 'Извините, такой логин использовать нельзя'; $this->errno[$name] = 2; } if (empty($this->error[$name])) { $sql = "SELECT uid FROM users WHERE lower(login) = ?"; if ($DB->val($sql, strtolower($value))) { $this->error[$name] = 'Извините, этот логин занят. Придумайте другой.'; $this->errno[$name] = 3; } } break; case 'email': if (!is_email($value)) { $this->error[$name] = 'Поле заполнено некорректно'; $this->errno[$name] = 1; } if (empty($this->error[$name])) { require_once $_SERVER['DOCUMENT_ROOT'] . "/classes/temp_email.php"; if (temp_email::isTempEmail($value)) { $this->error[$name] = 'К сожалению, регистрация аккаунта на указанный адрес электронной почты невозможна. Пожалуйста, для регистрации воспользуйтесь почтовым адресом другого домена'; $this->errno[$name] = 2; } else { if ($DB->val("SELECT uid FROM users WHERE lower(email) = ?", strtolower($value))) { if ($this->_disable_email_redirect) { $this->error[$name] = 'Email занят'; $this->errno[$name] = 3; } else { require_once $_SERVER['DOCUMENT_ROOT'] . "/classes/smail.php"; $smail = new smail(); $smail->reRegisterToYourMail(strtolower($value)); unset($_SESSION["regform_captcha_entered"]); unset($_SESSION["reg_phone"]); unset($_SESSION['send_sms_time']); header_location_exit("/reg_complete.php"); } } } } break; case 'smscode': if ($_SESSION['smsCode'] != $value && !($value == 7777 && $_SESSION["reg_phone"] == 71111112222 && !is_release())) { $this->error[$name] = 'Неверный код'; } break; case 'phone': if (!$phone_is_set && $_SESSION["reg_phone"] != $value) { $this->error[$name] = 'Вы подтвердили не этот номер'; $this->errno[$name] = 1; } $sPhone = $phone_is_set ? $value : $_SESSION['reg_phone']; if (trim(preg_replace("#[\\D]#", "", $sPhone)) == '') { $this->error[$name] = 'Необходимо ввести номер'; $this->errno[$name] = 2; } break; } }
/** * Создвние нового пользователя. * * @param integer $rerror ошибка в данных пользователя * @param array $error ошибки базы данных * * @return mixed id пользователя или ошибку, в случае неуспеха */ public function Create(&$rerror, &$error) { global $DB; $id = 0; $ip = getRemoteIP(); // количество регистраций с одного IP $sDate = date('Y-m-d'); $sQuery = 'SELECT COUNT(uid) FROM users WHERE reg_ip=? AND reg_date=?'; $nCount = $DB->val($sQuery, $ip, $sDate); if ($nCount >= self::MAX_REG_IP) { $error['exceed_max_reg_ip'] = 1; // пишем лог $sQuery = 'SELECT COUNT(reg_ip) FROM users_regip_log WHERE reg_ip=? AND reg_date=?'; if (!$DB->val($sQuery, $ip, $sDate)) { $DB->insert('users_regip_log', array('reg_ip' => $ip, 'reg_date' => $sDate)); } return 0; } if (!preg_match('/^[a-zA-Z0-9]+[-a-zA-Z0-9_]{2,}$/', $this->login)) { $rerror += 1; } if ($this->checked_name) { if (!preg_match('/^[-a-zA-Zа-яА-ЯёЁ]+$/', $this->uname)) { $rerror += 2; } if (!preg_match('/^[-a-zA-Zа-яА-ЯёЁ]+$/', $this->usurname)) { $rerror += 4; } } if (!is_email($this->email)) { $rerror += 8; } if (!($rerror & 1)) { $sql = 'SELECT uid FROM users WHERE lower(login) = ?'; if ($DB->val($sql, strtolower($this->login))) { $error['login_ex'] = 1; } } if (!($rerror & 8)) { require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/temp_email.php'; if (temp_email::isTempEmail($this->email)) { $error['email_ex'] = 2; } else { $sql = 'SELECT uid FROM users WHERE lower(email) = ?'; if ($DB->val($sql, strtolower($this->email))) { $error['email_ex'] = 1; } } } if (!$error && !$rerror) { if (!preg_match('/^[0-1]{16}/', $this->subscr)) { $this->subscr = '1111111111111111'; } $rolesize = $GLOBALS['rolesize']; $sex_str = 'NULL'; //$this->sex ? 'true' : 'false'; $active = true; $sql = "\n INSERT INTO users\n (login, uname, usurname, passwd, email, role, reg_date, reg_ip, last_time, last_ip, sex, active, subscr) \n VALUES \n (?, ?, ?, ?, lower(?), B'{$this->role}'::bit({$rolesize}),current_date, ?, now(), ?, {$sex_str}, ?, ?); \n SELECT currval('users_uid_seq');"; $id = $DB->val($sql, $this->login, $this->uname, $this->usurname, self::hashPasswd($this->passwd), $this->email, $ip, $ip, $active, $this->subscr); $error = $DB->error; if (!$error && !$rerror && $id) { $sd = substr($this->login, 0, 2) . '/'; $cfile = new CFile(); $cfile->DeleteDir('users/' . $sd . $this->login . '/'); self::SaveChangeEmailLog($id, $this->email); } else { // $error = parse_db_error($error, $ex_err); $error = parse_db_error($error, $ex_err); if ($ex_err) { $error = $ex_err; } } } return $id; }