/** * Залогинивает юзера. Возвращает UID юзера. Выставляет куки "автологина". * ВНИМАНИЕ! возвращает UID юзера, если находит его. Либо возвращает * 0 - не найден * -1 - аккаунт забанен * -2 - аккаунт неактивирован * -3 - IP не входит в список IP разрешенных пользователем * -4 - требуется 2ой этап авторизации * * @param string $login логин юзера * @param string $pwd пароль * @param integer $autologin флаг "автологина" * @return integer UID юзера */ function login($login, $pwd, $autologin = 0, $annoy_check = true) { require_once $_SERVER['DOCUMENT_ROOT'] . "/classes/annoy.php"; $annoy = new annoy(); $user = new users(); if ($annoy_check) { if (intval($_SESSION['login_wait_time']) > time()) { $redirect_checkpass = true; } else { // Проверить сколько раз воодился пароль if (isset($_SESSION['login_wait_time'])) { $annoy->Clear(getRemoteIP()); } $login_count = $annoy->Check(getRemoteIP()); if ($login_count >= $GLOBALS['max_login_tries']) { $_SESSION['login_wait_time'] = time() + $GLOBALS['login_wait_time'] * 60; $redirect_checkpass = true; } } if ($redirect_checkpass == true) { header("Location: /checkpass.php"); exit; } } //Получаем логин и проверяем счетчик $_uid = $user->getUidByLoginEmailPhone($login); if ($_uid > 0 && !$annoy->allowRepeatPass($_uid)) { header("Location: /banned.php"); exit; } //@todo: нет проверок наличия ключей $t_filter_prj = $_SESSION['f_project_filter']; $t_filter_frl = $_SESSION['f_freelancers_filter']; $t_ref_uri2 = $_SESSION['ref_uri2']; $adCatalog = $_SESSION['toppayed_catalog']; $adMain = $_SESSION['toppayed_main']; $adHead = $_SESSION['toppayed_head']; $adText = $_SESSION['toppayed_text']; $masssending = $_SESSION['masssending']; $newPrjName = $_SESSION['new_project_name']; $newPrjCost = $_SESSION['new_project_cost']; //Сохраняем значение типа 2хэпапной авторизации перед очисткой сессии $_2fa_provider = isset($_SESSION['2fa_provider']) ? $_SESSION['2fa_provider'] : null; $_2fa_redirect = isset($_SESSION['2fa_redirect']) ? $_SESSION['2fa_redirect'] : null; //Переносим хеши ссылок на уже зафиксированные местки для юзера при выходе/входе $_ga_stat_url_hash = isset($_SESSION['ga_stat_url_hash']) ? $_SESSION['ga_stat_url_hash'] : null; //Последняя посещенная страница $_ref_uri = isset($_SESSION['ref_uri']) ? $_SESSION['ref_uri'] : null; $_pda = isset($_SESSION['pda']) ? $_SESSION['pda'] : null; $_customer_wizard = isset($_SESSION['customer_wizard']) ? $_SESSION['customer_wizard'] : null; session_unset(); if ($_customer_wizard) { $_SESSION['customer_wizard'] = $_customer_wizard; } if ($_pda) { $_SESSION['pda'] = $_pda; } if ($_ref_uri) { $_SESSION['ref_uri'] = $_ref_uri; } //Воссанавливаем значение хешей ссылок if ($_ga_stat_url_hash) { $_SESSION['ga_stat_url_hash'] = $_ga_stat_url_hash; } //Востанавливаем значение 2хэпапной авторизации после очистки сессии if ($_2fa_provider !== null) { $_SESSION['2fa_provider'] = $_2fa_provider; } if ($_2fa_redirect !== null) { $_SESSION['2fa_redirect'] = $_2fa_redirect; } //Выключаем проверку 2ого этапа авторизации //если это вход из куки или еще откуда (но неявно от пользователя) //где мы уже уверены что 2этапа пройдены ранее юзером $is_2fa_off = $annoy_check === false; //Авторизация $id = $user->Auth($login, $pwd, $_SESSION, $is_2fa_off); //Считаем и блокируем по количеству неудачных авторизаций if (!$id && $_uid > 0) { $annoy->wrongRepeatPass($_uid); } //Успешная авторизация if ($id > 0) { $annoy->clearRepeatPass($id); require_once $_SERVER['DOCUMENT_ROOT'] . "/classes/payed.php"; $pro_last = payed::ProLast($_SESSION['login']); //Покупал ли пользователь ПРО 1 мес и более или тестовый if (!is_emp()) { $_SESSION['is_was_pro'] = $pro_last ? true : payed::isWasPro($_SESSION['uid']); } $_SESSION['pro_last'] = $pro_last['is_freezed'] ? false : $pro_last['cnt']; if ($_SESSION['pro_last'] && $_SESSION['is_pro_new'] != 't') { payed::checkNewPro($id); } if ($pro_last['freeze_to']) { $_SESSION['freeze_from'] = $pro_last['freeze_from']; $_SESSION['freeze_to'] = $pro_last['freeze_to']; $_SESSION['is_freezed'] = $pro_last['is_freezed']; $_SESSION['payed_to'] = $pro_last['cnt']; } if ($_SESSION['anti_login']) { $pro_last = payed::ProLast($_SESSION['anti_login']); $_SESSION['anti_pro_last'] = $pro_last['freeze_to'] ? false : $pro_last['cnt']; } require_once $_SERVER['DOCUMENT_ROOT'] . "/classes/memBuff.php"; $memBuff = new memBuff(); $memBuff->delete("msgsCnt{$id}"); //Получение спецализаций фрилансера if (!is_emp()) { require_once ABS_PATH . "/classes/freelancer.php"; $specData = freelancer::getAllSpecAndGroup($id, is_pro()); $_SESSION['specs'] = $specData['specs']; //Список специализаций $_SESSION['groups'] = $specData['groups']; //Список групп //@todo: пока не используется //$_SESSION['specs_tree'] = $specData['specs_tree']; //Ввиде древа группа > специализации } require_once $_SERVER['DOCUMENT_ROOT'] . "/classes/drafts.php"; $iDraftsCount = drafts::getCount($id); $_SESSION['drafts_count'] = $iDraftsCount; if ($autologin == 1) { setcookie('id', $id, time() + 60 * 60 * 24 * 30, '/', $GLOBALS['domain4cookie'], COOKIE_SECURE, true); setcookie('name', $login, time() + 60 * 60 * 24 * 30, '/', $GLOBALS['domain4cookie'], COOKIE_SECURE); setcookie('pwd', users::cookieHashPasswd($id), time() + 60 * 60 * 24 * 30, '/', $GLOBALS['domain4cookie'], COOKIE_SECURE, true); } $_SESSION['f_project_filter'] = $t_filter_prj; $_SESSION['f_freelancers_filter'] = $t_filter_frl; $_SESSION['ref_uri2'] = $t_ref_uri2; $_SESSION['toppayed_catalog'] = $adCatalog; $_SESSION['toppayed_main'] = $adMain; $_SESSION['toppayed_head'] = $adHead; $_SESSION['toppayed_text'] = $adText; if ($masssending) { $_SESSION['masssending'] = $masssending; } $_SESSION['new_project_name'] = $newPrjName; $_SESSION['new_project_cost'] = $newPrjCost; if ($t_filter_prj) { require_once $_SERVER['DOCUMENT_ROOT'] . "/classes/projects_filter.php"; $prj_filter = new projects_filters(); $prj_filter->SaveFromAnon(); } if ($t_filter_frl) { require_once $_SERVER['DOCUMENT_ROOT'] . "/classes/freelancers_filter.php"; $frl_filter = new freelancers_filters(); $frl_filter->SaveFromAnon(); } //var_dump($_SESSION['customer_wizard']); //var_dump($_SESSION['customer_wizard_filled']); //exit; //Если заказчик пытается опубликовать проект через мастер то публикуем после авторизации if (is_emp() && isset($_SESSION['customer_wizard']['filled'])) { require_once ABS_PATH . '/guest/models/GuestActivationModel.php'; $_SESSION['ref_uri'] = GuestActivationModel::model()->published($id, $_SESSION['email']); } } // случайное число, используемое в get/post запросах для защиты. if (!$_SESSION['rand']) { $_SESSION['rand'] = csrf_token(); } return $id; }
require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/spam.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/attachedfiles.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/commune.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/articles.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/users_suspicious_contacts.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/FreelancerCatalog.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/annoy.php'; $mail = new smail(); $mail2 = new smail2(); $spam = new spam(); $H = (int) date('H'); /* * Чистим счетчик неправильного * ввода пароля для пользователя */ annoy::clearRepeatPassByCnt(); //$cfile = new CFile(); //$log->TRACE( $cfile->removeDeleted() ); if ($H == 0) { $log->TRACE($traffic_stat->calculateStatsIp()); } // Обновляем карту сайта // try { // $log->TRACE( sitemap::update('blogs') ); // } catch(Exception $e) { // $log->TRACE($e->getMessage()); // } try { $log->TRACE(sitemap::update('projects')); } catch (Exception $e) { $log->TRACE($e->getMessage());
/** * Аутентификация пользователя и заполнение его сессии необходимыми данными. * * @param string $login логин пользователя * @param string $pwd пароль пользователя * @param array ¶ms данные пользователя * @param boolean $is_2fa_off принудительное откулючение 2х этапной проверки * * @return integer id сессии * * @global DB $DB */ public function Auth($login, $pwd, &$params, $is_2fa_off = false) { ////////////////////////////////////////////////////////// // Ахтунг! Изменение логики нужно отражать также в новом движке. // Например, при добавлении новый полей в сессию, добавьте их в Web_Front::login() ////////////////////////////////////////////////////////// global $DB; $plogin = preg_replace('/[+ ()-]/', '', $login); $phoneType = preg_replace("/\\D/", '', $plogin); if ($phoneType == $plogin) { $plogin = '******' . $plogin; $sql = "SELECT user_id FROM sbr_reqv WHERE (_1_mob_phone = ? OR _2_mob_phone = ?) AND is_activate_mob = 't'"; $uids = $DB->rows($sql, $plogin, $plogin); if ($uids) { foreach ($uids as $u) { $sql_uids .= $u['user_id'] . ','; } $sql_uids = preg_replace('/,$/', '', $sql_uids); } } $sql = ' SELECT u.email, u.role, u.uname, u.usurname, u.uid, u.is_banned, u.ban_where, u.active, a.sum, a.bonus_sum, u.login, u.anti_uid, u.is_pro_test, u.is_pro_new, u.is_chuck, u.sex, u.settings, u.splash_show, u.is_verify, u.reg_date, ac.code, u.photo, u.is_profi, u.birthday FROM users AS u LEFT JOIN activate_code ac ON ac.user_id = u.uid LEFT JOIN account AS a ON a.uid = u.uid WHERE ((lower(u.login) = ? OR lower(u.email) = ?) AND u.passwd = ?) ' . ($sql_uids ? "OR ( u.uid IN ({$sql_uids}) AND u.passwd = ?)" : ''); $res = $DB->rows($sql, strtolower($login), mb_strtolower($login), $pwd, $pwd); if ($res) { $qres = $res; $uvisits = array(); $n = 0; foreach ($qres as $k => $v) { $uvisits[$this->getLastVisit($v['uid']) . '-' . $n] = $k; ++$n; } asort($uvisits); $res = $qres[array_pop($uvisits)]; } $error .= $DB->error; $first_login = $this->getLastVisit($res['uid']); $ip = getRemoteIP(); /** * Дополнительная проверка логина. * Нужна для исправления паролей, содержащих * теги (или похожие на теги последовательности). * * !!Убрать после следующей глобальной смены паролей. */ if (!$res) { // попробуем убрать (0018079) //$res = $this->FixPassword($sql, $login); } /** * Определяем нужна ли 2хэтапная авторизация. */ if (!$is_2fa_off && count($res) && $first_login) { //не первый вход //если на 2ом этапе ввели другой аккаунт то направить //обратно на 2ой этап и сообщить обэтом if (isset($params['2fa_provider']['uid']) && $params['2fa_provider']['uid'] != $res['uid']) { $is_login = $params['2fa_provider']['type'] == 0; session::setFlashMessage($is_login ? self::TXT_AUTH_2FA_LOG_FAIL : self::TXT_AUTH_2FA_SOC_FAIL, '/auth/second/'); return self::AUTH_STATUS_2FA; } $is_opauth = defined('IS_OPAUTH'); if (!isset($params['2fa_provider']) || $params['2fa_provider']['type'] > 0 != $is_opauth) { //несовпадают типы авторизаций на 2ом этапе require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/opauth/OpauthModel.php'; $opauthModel = new OpauthModel(); $is_2fa = $opauthModel->getMultilevel($res['uid']); if (isset($is_2fa['type'])) { //$is_2fa - авторизация через выбранную соцсеть //0 - нужна обычная авторизация так как вход был выполнен через соцсеть $params['2fa_provider'] = array('type' => !$is_opauth ? $is_2fa['type'] : 0, 'uid' => $res['uid'], 'login' => $res['login']); //Сбрасываем авторизацию $res = array(); //переходим ко 2ой стадии return self::AUTH_STATUS_2FA; } } } //Более нам параметр этапов авторизации не нужен unset($params['2fa_provider']); /** * Успешная авторизация. */ if (count($res)) { list($email, $trole, $tname, $tsurname, $tid, $is_banned, $ban_where, $active, $sum, $bonus_sum, $log, $anti_uid, $is_pro_test, $is_pro_new, $is_chuck, $sex, $settings, $splash_show, $is_verify, $reg_date, $activate_code, $photo, $is_profi, $birthday) = array_values($res); if ($activate_code != '' && $active == 't') { $this->checkRegDate($tid, $reg_date); } if ($is_banned) { return -1; } //if ($active=='f') return -2; //##0027983 if (!$this->CheckUserAllowIP($ip, $tid)) { return -3; } $params['birthday'] = $birthday ? strtotime($birthday) : null; $params['age'] = $params['birthday'] ? intval(ElapsedYears($params['birthday'])) : null; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/permissions.php'; $params['permissions'] = permissions::getUserPermissions($tid); $params['email'] = $email; $params['role'] = $trole; $params['name'] = $tname; $params['surname'] = $tsurname; $params['uid'] = $tid; $params['user_ip'] = $ip; $params['ac_sum'] = zin($sum); $params['bn_sum'] = zin($bonus_sum); $params['login'] = $log; $params['is_pro_new'] = $is_pro_new; $params['pro_test'] = $is_pro_test; $params['is_chuck'] = $is_chuck; $params['is_verify'] = $is_verify; $params['sex'] = $sex; $params['reg_date'] = $reg_date; $params['photo'] = $photo; if (!is_emp($trole)) { $params['is_profi'] = $is_profi === 't'; } if ($anti_uid) { $anti_class = is_emp($trole) ? 'freelancer' : 'employer'; require_once $_SERVER['DOCUMENT_ROOT'] . "/classes/{$anti_class}.php"; $anti = new $anti_class(); $anti->GetUserByUID($anti_uid); $params['anti_uid'] = $anti->uid; $params['anti_login'] = $anti->login; $params['anti_surname'] = $anti->usurname; $params['anti_name'] = $anti->uname; } if (!is_emp($params['role'])) { require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/projects_offers.php'; if ($po_summary = projects_offers::GetFrlOffersSummary($params['uid'])) { $params['po_count'] = $po_summary['total']; } } $sql = 'UPDATE users SET last_time = now(), last_ip = ?, is_active = true WHERE uid = ?i'; $res = $DB->query($sql, $ip, $tid); $this->SaveLoginIPLog($tid, $ip); $this->increaseLoginsCnt($tid); // количество операций $sQuery = 'SELECT COUNT(ao.id) FROM account_operations ao INNER JOIN account a ON a.id = ao.billing_id WHERE a.uid = ?i AND (ao.ammount <> 0 OR ao.trs_sum <> 0)'; $params['account_operations'] = $DB->val($sQuery, $tid); $params['question_button_hide'] = $settings[1]; // Показывать/скрывать кнопку "У вас есть вопрос?" $params['promo_block_hide'] = $settings[2]; // показывать Блок "Быстрый доступ к основным функциям сайта" $params['direct_external_links'] = $settings[3]; // Не показывать страницу "Переход по внешней ссылке" a.php $params['sbr_slash_show'] = $settings[4] && $first_login < strtotime('2012-08-08'); // Показывать/скрыть СБР промо-слеш $params['splash_show'] = $splash_show; $params['chat'] = $settings[5]; $params['chat_sound'] = $settings[6]; // #0017182 > Вопрос можем ли мы вытащить эту настройку из кук пользователей и сохранить ее в базу? if (empty($settings[3]) && $_COOKIE['direct_external_links'] == 1) { $this->setDirectExternalLinks($tid, 1); if ($anti_uid) { $this->setDirectExternalLinks($anti_uid, 1); } setcookie('direct_external_links', '', time() - 60 * 60 * 24 * 365, '/'); setcookie('no_a_php', '1', time() + 60 * 60 * 24 * 365 * 2, '/'); } //генерация куки для userecho require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/userecho.php'; setcookie('ue_sso_token', UserEcho::get_sso_token(USERECHO_API_KEY, USERECHO_PROJECT_KEY, array()), 0, '/', preg_replace('/^https?\\:\\/\\/(?:www\\.)?/', '.', 'fl.ru')); // Первый заход, регистрация через мастер, мастер не закончен if ($first_login == 0) { require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/wizard/wizard.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/wizard/wizard_registration.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/wizard/step_employer.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/wizard/step_freelancer.php'; if (is_emp($params['role'])) { $wiz_user = wizard::isUserWizard($tid, step_employer::STEP_REGISTRATION_CONFIRM, wizard_registration::REG_EMP_ID); } else { $wiz_user = wizard::isUserWizard($tid, step_freelancer::STEP_REGISTRATION_CONFIRM, wizard_registration::REG_FRL_ID); } if ($wiz_user['id'] > 0) { $role = is_emp($params['role']) ? wizard_registration::REG_EMP_ID : wizard_registration::REG_FRL_ID; header('Location: /registration/activated.php?role=' . $role); //header("Location: /wizard/registration/?role={$role}"); exit; } elseif (!is_emp($params['role'])) { require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/payed.php'; $pro_last = payed::ProLast($_SESSION['login']); $_SESSION['pro_last'] = $pro_last['is_freezed'] ? false : $pro_last['cnt']; if ($_SESSION['pro_last'] && $_SESSION['is_pro_new'] != 't') { payed::checkNewPro($id); } if ($pro_last['freeze_to']) { $_SESSION['freeze_from'] = $pro_last['freeze_from']; $_SESSION['freeze_to'] = $pro_last['freeze_to']; $_SESSION['is_freezed'] = $pro_last['is_freezed']; $_SESSION['payed_to'] = $pro_last['cnt']; } if ($_SESSION['anti_login']) { $pro_last = payed::ProLast($_SESSION['anti_login']); $_SESSION['anti_pro_last'] = $pro_last['freeze_to'] ? false : $pro_last['cnt']; } //отправляем письмо с инфой, как работать на сайте /* require_once($_SERVER['DOCUMENT_ROOT'] . "/classes/smail.php"); $mail = new smail(); if (is_emp()) { $mail->employerQuickStartGuide(get_uid(false)); } else { $mail->freelancerQuickStartGuide(get_uid(false)); } */ return $tid; if (!defined('IN_API')) { // для API мобильного приложения не нужно header("Location: /users/{$login}/"); exit; } } } //----------------------------------- } else { $tid = 0; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/annoy.php'; $annoy = new annoy(); $annoy->Add($ip); } return $tid; }