Просмотр файла app/Http/Controllers/MailController.php

Размер файла: 7.98Kb
  1. <?php
  2.  
  3. declare(strict_types=1);
  4.  
  5. namespace App\Http\Controllers;
  6.  
  7. use App\Classes\Validator;
  8. use App\Models\User;
  9. use Illuminate\Http\RedirectResponse;
  10. use Illuminate\Http\Request;
  11. use Illuminate\Support\Str;
  12. use Illuminate\View\View;
  13.  
  14. class MailController extends Controller
  15. {
  16. /**
  17. * Главная страница
  18. *
  19. * @param Request $request
  20. * @param Validator $validator
  21. *
  22. * @return View|RedirectResponse
  23. */
  24. public function index(Request $request, Validator $validator)
  25. {
  26. if ($request->isMethod('post')) {
  27. $message = $request->input('message');
  28. $name = $request->input('name');
  29. $email = $request->input('email');
  30.  
  31. if ($user = getUser()) {
  32. $name = $user->login;
  33. $email = $user->email;
  34. }
  35.  
  36. $validator->true(captchaVerify(), ['protect' => __('validator.captcha')])
  37. ->length($name, 3, 100, ['name' => __('mails.name_short_or_long')])
  38. ->length($message, 5, 50000, ['message' => __('validator.text')])
  39. ->email($email, ['email' => __('validator.email')]);
  40.  
  41. if ($validator->isValid()) {
  42. $subject = __('mails.email_from_site', ['sitename' => setting('title')], setting('language'));
  43.  
  44. $message = str_replace(
  45. '/uploads/stickers',
  46. config('app.url') . '/uploads/stickers',
  47. bbCode($message)->toHtml()
  48. );
  49.  
  50. $message .= '<br><br>Email: ' . $name . ' &lt;' . $email . '&gt;<br>IP: ' . getIp() . '<br>Browser: ' . getBrowser() . '<br>' . __('main.sent_out', [], setting('language')) . ': ' . dateFixed(SITETIME, 'd.m.y / H:i');
  51. $data = [
  52. 'to' => config('app.email'),
  53. 'subject' => $subject,
  54. 'text' => $message,
  55. 'from' => [$email, $name],
  56. ];
  57.  
  58. $send = sendMail('mailer.default', $data);
  59.  
  60. if ($send) {
  61. setFlash('success', __('mails.success_sent'));
  62. } else {
  63. setFlash('danger', __('mails.failed_sent'));
  64. }
  65.  
  66. return redirect('/mails');
  67. }
  68.  
  69. setInput($request->all());
  70. setFlash('danger', $validator->getErrors());
  71. }
  72.  
  73. return view('mails/index');
  74. }
  75.  
  76. /**
  77. * Восстановление пароля
  78. *
  79. * @param Request $request
  80. * @param Validator $validator
  81. *
  82. * @return View|RedirectResponse
  83. */
  84. public function recovery(Request $request, Validator $validator)
  85. {
  86. if (getUser()) {
  87. setFlash('danger', __('main.already_authorized'));
  88.  
  89. return redirect('/');
  90. }
  91.  
  92. $cookieLogin = $request->cookie('login');
  93.  
  94. if ($request->isMethod('post')) {
  95. $user = getUserByLoginOrEmail($request->input('user'));
  96. if (! $user) {
  97. abort(200, __('validator.user'));
  98. }
  99.  
  100. $validator->true(captchaVerify(), ['protect' => __('validator.captcha')])
  101. ->lte($user->timepasswd, SITETIME, ['user' => __('mails.password_recovery_time')]);
  102.  
  103. if ($validator->isValid()) {
  104. $resetKey = Str::random();
  105. $resetLink = config('app.url') . '/restore?key=' . $resetKey;
  106.  
  107. $user->update([
  108. 'keypasswd' => $resetKey,
  109. 'timepasswd' => strtotime('+1 hour', SITETIME),
  110. ]);
  111.  
  112. //Инструкция по восстановлению пароля на email
  113. $subject = 'Восстановление пароля на ' . setting('title');
  114. $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>Если это письмо попало к вам по ошибке или вы не собираетесь восстанавливать пароль, то просто проигнорируйте его';
  115.  
  116. $data = [
  117. 'to' => $user->email,
  118. 'subject' => $subject,
  119. 'text' => $message,
  120. 'resetLink' => $resetLink,
  121. ];
  122.  
  123. sendMail('mailer.recovery', $data);
  124. setFlash('success', __('mails.recovery_instructions', ['email' => hideMail($user->email)]));
  125.  
  126. return redirect('login');
  127. }
  128.  
  129. setInput($request->all());
  130. setFlash('danger', $validator->getErrors());
  131. }
  132.  
  133. return view('mails/recovery', compact('cookieLogin'));
  134. }
  135.  
  136. /**
  137. * Восстановление пароля
  138. *
  139. * @param Request $request
  140. * @param Validator $validator
  141. *
  142. * @return View|RedirectResponse
  143. */
  144. public function restore(Request $request, Validator $validator)
  145. {
  146. if (getUser()) {
  147. setFlash('danger', __('main.already_authorized'));
  148.  
  149. return redirect('/');
  150. }
  151.  
  152. $key = $request->input('key');
  153.  
  154. /** @var User $user */
  155. $user = User::query()->where('keypasswd', $key)->first();
  156. if (! $user) {
  157. abort(200, __('mails.secret_key_invalid'));
  158. }
  159.  
  160. $validator->notEmpty($key, __('mails.secret_key_missing'))
  161. ->notEmpty($user->keypasswd, __('mails.password_not_recovery'))
  162. ->gte($user->timepasswd, SITETIME, __('mails.secret_key_expired'));
  163.  
  164. if ($validator->isValid()) {
  165. $newpass = Str::random();
  166. $hashnewpas = password_hash($newpass, PASSWORD_BCRYPT);
  167.  
  168. $user->update([
  169. 'password' => $hashnewpas,
  170. 'keypasswd' => null,
  171. 'timepasswd' => 0,
  172. ]);
  173.  
  174. // Восстановление пароля на email
  175. $subject = 'Восстановление пароля на ' . setting('title');
  176. $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>Всего наилучшего!';
  177.  
  178. $data = [
  179. 'to' => $user->email,
  180. 'subject' => $subject,
  181. 'text' => $message,
  182. ];
  183.  
  184. sendMail('mailer.default', $data);
  185.  
  186. return view('mails/restore', ['login' => $user->login, 'password' => $newpass]);
  187. }
  188.  
  189. setFlash('danger', current($validator->getErrors()));
  190.  
  191. return redirect('/');
  192. }
  193.  
  194. /**
  195. * Отписка от рассылки
  196. *
  197. * @param Request $request
  198. *
  199. * @return RedirectResponse
  200. */
  201. public function unsubscribe(Request $request): RedirectResponse
  202. {
  203. $key = $request->input('key');
  204.  
  205. if (! $key) {
  206. abort(200, __('mails.secret_key_missing'));
  207. }
  208.  
  209. $user = User::query()->where('subscribe', $key)->first();
  210.  
  211. if (! $user) {
  212. abort(200, __('mails.secret_key_expired'));
  213. }
  214.  
  215. $user->subscribe = null;
  216. $user->save();
  217.  
  218. setFlash('success', __('mails.success_unsubscribed'));
  219. return redirect('/');
  220. }
  221. }