Просмотр файла libarea-0.9/app/Controllers/Auth/RecoverController.php

Размер файла: 4.41Kb
<?php

declare(strict_types=1);

namespace App\Controllers\Auth;

use Hleb\Static\Request;
use Hleb\Base\Controller;
use App\Models\User\{UserModel, SettingModel};
use App\Models\Auth\AuthModel;
use App\Content\Integration\Google;
use SendEmail, Meta, Html, Msg;

use Respect\Validation\Validator as v;

class RecoverController extends Controller
{
    public function index()
    {
        $redirect  = url('recover');

        if (config('integration', 'captcha')) {
            if (!Google::checkCaptchaCode()) {
                Msg::redirect(__('msg.code_error'), 'error', $redirect);
            }
        }

		$email = Request::post('email')->value();
        if (v::email()->isValid($email) === false) {
            Msg::redirect(__('msg.email_correctness'), 'error', $redirect);
        }

        $uInfo = AuthModel::getUser($email, 'email');

        if (empty($uInfo['email'])) {
            Msg::redirect(__('msg.no_user'), 'error', $redirect);
        }

        if ($uInfo['ban_list'] == 1) {
            Msg::redirect(__('msg.account_verified'), 'error', $redirect);
        }

        $code = $uInfo['id'] . '-' . Html::randomString('crypto', 24);
        AuthModel::initRecover(
            [
                'activate_date'     => date('Y-m-d H:i:s'),
                'activate_user_id'  => $uInfo['id'],
                'activate_code'     => $code,
            ]
        );

        SendEmail::mailText($uInfo['id'], 'changing.password', ['link' => url('recover.code', ['code' => $code])]);

        Msg::redirect(__('msg.new_password_email'), url('login'));
    }

    /**
     * Password Change page
     * Страница смены пароля
     *
     * @return void
     */
    public function showPasswordForm(): void
    {
        $m = [
            'og'    => false,
            'url'   => url('recover'),
        ];

        render(
            '/auth/recover',
            [
                'meta'  => Meta::get(__('app.password_recovery'), __('app.recover_info'), $m),
                'data'  => [
                    'sheet' => 'recover',
                    'type'  => 'recover',
                ]
            ]
        );
    }

    /**
     * The page for setting a new password
     * Страница установки нового пароля
     *
     * @return void
     */
    public function showRemindForm(): void
    {
        $code       = Request::param('code')->asString();
        $user_id    = AuthModel::getPasswordActivate($code);

        if (!$user_id) {
            Msg::add(__('msg.went_wrong'), 'error');
            redirect(url('login'));
        }

        $user = UserModel::get($user_id['activate_user_id'], 'id');
        notEmptyOrView404($user);

        render(
            '/auth/newrecover',
            [
                'meta'  => Meta::get(__('app.password recovery'), __('app.recover_info')),
                'data'  => [
                    'code'      => $code,
                    'user_id'   => $user_id['activate_user_id'],
                    'sheet'     => 'recovery',
                    'type'      => 'newrecover',
                ]
            ]
        );
    }

    public function remindNew()
    {
        $password   = Request::post('password')->value();
        $code       = Request::post('code')->value();
        $user_id    = Request::post('user_id')->asInt();

        if (!$user_id) {
            return false;
        }

		if (v::stringType()->length(8, 32)->validate($password) === false) {
			Msg::redirect(__('msg.string_length', ['name' => '«' . __('msg.title') . '»']), 'error', url('recover.code', ['code' => $code]));
		}

        $newpass  = password_hash($password, PASSWORD_BCRYPT);
        SettingModel::editPassword(['id' => $user_id, 'password' => $newpass]);

        AuthModel::editRecoverFlag($user_id);

        Msg::redirect(__('msg.change_saved'), 'success', url('login'));

        return true;
    }

    /**
     * Checking the correctness of the Email
     * Проверка корректности E-mail
     *
     * @return void
     */
    public function activateEmail()
    {
        $code = Request::param('code')->asString();
        $activate_email = AuthModel::getEmailActivate($code);

        if (!$activate_email) {
            Msg::add(__('msg.code_incorrect'), 'error');
            redirect('/');
        }

        AuthModel::setEmailActivate($activate_email['user_id']);

        Msg::add(__('msg.yes_email_pass'), 'success');
        redirect(url('login'));
    }
}