Email.php 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. <?php
  2. /**
  3. * This file is part of the ForkBB <https://github.com/forkbb>.
  4. *
  5. * @copyright (c) Visman <mio.visman@yandex.ru, https://github.com/MioVisman>
  6. * @license The MIT License (MIT)
  7. */
  8. declare(strict_types=1);
  9. namespace ForkBB\Models\Validators;
  10. use ForkBB\Core\RulesValidator;
  11. use ForkBB\Core\Validator;
  12. use ForkBB\Models\User\User;
  13. class Email extends RulesValidator
  14. {
  15. /**
  16. * Проверяет email
  17. */
  18. public function email(Validator $v, string $email, string $attrs, /* mixed */ $originalUser): ?string
  19. {
  20. // поле отсутствует
  21. if ($v->noValue($email)) {
  22. return null;
  23. // проверка длины email
  24. } elseif (\mb_strlen($email, 'UTF-8') > $this->c->MAX_EMAIL_LENGTH) {
  25. $v->addError('Long email');
  26. return $email;
  27. // это не email
  28. } elseif (false === ($result = $this->c->Mail->valid($email, true))) {
  29. $v->addError('The :alias is not valid email');
  30. return $email;
  31. // есть другие ошибки
  32. } elseif (! empty($v->getErrors())) {
  33. return $result;
  34. }
  35. $email = $result;
  36. $attrs = \array_flip(\explode(',', $attrs));
  37. $ok = true;
  38. // провеерка бана email
  39. if (
  40. $ok
  41. && (
  42. isset($attrs['noban'])
  43. || isset($attrs['nosoloban'])
  44. )
  45. ) {
  46. $banType = $this->c->bans->isBanned(
  47. $this->c->users->create(['email' => $email])
  48. );
  49. if (
  50. $banType > 0
  51. && (
  52. isset($attrs['noban'])
  53. || (
  54. 1 === $banType
  55. && isset($attrs['nosoloban'])
  56. )
  57. )
  58. ) {
  59. $v->addError('Banned email');
  60. $ok = false;
  61. }
  62. }
  63. // проверка наличия 1 пользователя с этим email
  64. if (
  65. $ok
  66. && isset($attrs['exists'])
  67. ) {
  68. $user = $this->c->users->loadByEmail($email);
  69. if (! $user instanceof User) {
  70. $v->addError('Invalid email');
  71. $ok = false;
  72. }
  73. }
  74. // проверка уникальности email
  75. if (
  76. $ok
  77. && isset($attrs['unique'])
  78. ) {
  79. $user = $this->c->users->loadByEmail($email); // ???? exists и unique вместе же не должны встречаться!? O_o
  80. if (
  81. $user instanceof User
  82. && (
  83. ! $originalUser instanceof User
  84. || $originalUser->isGuest
  85. || $user->id !== $originalUser->id
  86. )
  87. ) {
  88. $v->addError('Dupe email');
  89. $ok = false;
  90. }
  91. }
  92. // проверка на флуд интервал
  93. if (
  94. $ok
  95. && isset($attrs['flood'])
  96. ) {
  97. if (
  98. $originalUser instanceof User
  99. && ! $originalUser->isGuest
  100. ) {
  101. $flood = \time() - $originalUser->last_email_sent;
  102. } elseif (
  103. $user instanceof User
  104. && ! $user->isGuest
  105. ) {
  106. $flood = \time() - $user->last_email_sent;
  107. } else {
  108. $flood = $this->c->FLOOD_INTERVAL;
  109. }
  110. if ($flood < $this->c->FLOOD_INTERVAL) {
  111. $v->addError(['Account email flood', (int) (($this->c->FLOOD_INTERVAL - $flood) / 60)], 'e');
  112. $ok = false;
  113. }
  114. }
  115. // возврат данных пользователя через 4-ый параметр
  116. if (
  117. $ok
  118. && $originalUser instanceof User
  119. && null === $originalUser->id
  120. && null === $originalUser->group_id
  121. && $user instanceof User
  122. && ! $user->isGuest
  123. ) {
  124. $originalUser->setAttrs($user->getAttrs());
  125. }
  126. return $email;
  127. }
  128. }