Esempio n. 1
0
/**
 * Залогинивает юзера. Возвращает 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;
}
Esempio n. 2
0
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());
Esempio n. 3
0
 /**
  * Аутентификация пользователя и заполнение его сессии необходимыми данными.
  *
  * @param string $login логин пользователя
  * @param string $pwd   пароль пользователя
  * @param array &params             данные пользователя
  * @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;
 }