<?php
declare(strict_types=1);
namespace App\Http\Controllers;
use App\Classes\Validator;
use App\Models\User;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Str;
use Illuminate\View\View;
class MailController extends Controller
{
/**
* Главная страница
*
* @param Request $request
* @param Validator $validator
*
* @return View|RedirectResponse
*/
public function index(Request $request, Validator $validator)
{
if ($request->isMethod('post')) {
$message = $request->input('message');
$name = $request->input('name');
$email = $request->input('email');
if ($user = getUser()) {
$name = $user->login;
$email = $user->email;
}
$validator->true(captchaVerify(), ['protect' => __('validator.captcha')])
->length($name, 3, 100, ['name' => __('mails.name_short_or_long')])
->length($message, 5, 50000, ['message' => __('validator.text')])
->email($email, ['email' => __('validator.email')]);
if ($validator->isValid()) {
$subject = __('mails.email_from_site', ['sitename' => setting('title')], defaultSetting('language'));
$message = str_replace(
'/uploads/stickers',
config('app.url') . '/uploads/stickers',
bbCode($message)->toHtml()
);
$message .= '<br><br>Email: ' . $name . ' <' . $email . '><br>IP: ' . getIp() . '<br>Browser: ' . getBrowser() . '<br>' . __('main.sent_out', [], defaultSetting('language')) . ': ' . dateFixed(SITETIME, 'd.m.y / H:i');
$data = [
'to' => config('app.email'),
'subject' => $subject,
'text' => $message,
'from' => [$email, $name],
];
$send = sendMail('mailer.default', $data);
if ($send) {
setFlash('success', __('mails.success_sent'));
} else {
setFlash('danger', __('mails.failed_sent'));
}
return redirect('/');
}
setInput($request->all());
setFlash('danger', $validator->getErrors());
}
return view('mails/index');
}
/**
* Восстановление пароля
*
* @param Request $request
* @param Validator $validator
*
* @return View|RedirectResponse
*/
public function recovery(Request $request, Validator $validator)
{
if (getUser()) {
setFlash('danger', __('main.already_authorized'));
return redirect('/');
}
$cookieLogin = $_COOKIE['login'] ?? '';
if ($request->isMethod('post')) {
$user = getUserByLoginOrEmail($request->input('user'));
if (! $user) {
abort(200, __('validator.user'));
}
$validator->true(captchaVerify(), ['protect' => __('validator.captcha')])
->lte($user->timepasswd, SITETIME, ['user' => __('mails.password_recovery_time')]);
if ($validator->isValid()) {
$resetKey = Str::random();
$resetLink = config('app.url') . '/restore?key=' . $resetKey;
$user->update([
'keypasswd' => $resetKey,
'timepasswd' => strtotime('+1 hour', SITETIME),
]);
//Инструкция по восстановлению пароля на email
$subject = 'Восстановление пароля на ' . setting('title');
$message = 'Здравствуйте, ' . $user->getName() . '<br>Вами была произведена операция по восстановлению пароля на сайте <a href="' . config('app.url') . '">' . setting('title') . '</a><br><br>Данные отправителя:<br>Ip: ' . getIp() . '<br>Браузер: ' . getBrowser() . '<br>Отправлено: ' . date('j.m.Y / H:i', SITETIME) . '<br><br>Для того чтобы восстановить пароль, вам необходимо нажать на кнопку восстановления<br>Если это письмо попало к вам по ошибке или вы не собираетесь восстанавливать пароль, то просто проигнорируйте его';
$data = [
'to' => $user->email,
'subject' => $subject,
'text' => $message,
'resetLink' => $resetLink,
];
sendMail('mailer.recovery', $data);
setFlash('success', __('mails.recovery_instructions', ['email' => hideMail($user->email)]));
return redirect('login');
}
setInput($request->all());
setFlash('danger', $validator->getErrors());
}
return view('mails/recovery', compact('cookieLogin'));
}
/**
* Восстановление пароля
*
* @param Request $request
* @param Validator $validator
*
* @return View|RedirectResponse
*/
public function restore(Request $request, Validator $validator)
{
if (getUser()) {
setFlash('danger', __('main.already_authorized'));
return redirect('/');
}
$key = $request->input('key');
/** @var User $user */
$user = User::query()->where('keypasswd', $key)->first();
if (! $user) {
abort(200, __('mails.secret_key_invalid'));
}
$validator->notEmpty($key, __('mails.secret_key_missing'))
->notEmpty($user->keypasswd, __('mails.password_not_recovery'))
->gte($user->timepasswd, SITETIME, __('mails.secret_key_expired'));
if ($validator->isValid()) {
$newpass = Str::random();
$hashnewpas = password_hash($newpass, PASSWORD_BCRYPT);
$user->update([
'password' => $hashnewpas,
'keypasswd' => null,
'timepasswd' => 0,
]);
// Восстановление пароля на email
$subject = 'Восстановление пароля на ' . setting('title');
$message = 'Здравствуйте, ' . $user->getName() . '<br>Ваши новые данные для входа на на сайт <a href="' . config('app.url') . '">' . setting('title') . '</a><br><b>Логин: ' . $user->login . '</b><br><b>Пароль: ' . $newpass . '</b><br><br>Запомните и постарайтесь больше не забывать данные <br>Пароль вы сможете поменять в своем профиле<br>Всего наилучшего!';
$data = [
'to' => $user->email,
'subject' => $subject,
'text' => $message,
];
sendMail('mailer.default', $data);
return view('mails/restore', ['login' => $user->login, 'password' => $newpass]);
}
setFlash('danger', current($validator->getErrors()));
return redirect('/');
}
/**
* Отписка от рассылки
*
* @param Request $request
*
* @return RedirectResponse
*/
public function unsubscribe(Request $request): RedirectResponse
{
$key = $request->input('key');
if (! $key) {
abort(200, __('mails.secret_key_missing'));
}
$user = User::query()->where('subscribe', $key)->first();
if (! $user) {
abort(200, __('mails.secret_key_expired'));
}
$user->subscribe = null;
$user->save();
setFlash('success', __('mails.success_unsubscribed'));
return redirect('/');
}
}