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

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