Username.php 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  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 Username extends RulesValidator
  14. {
  15. /**
  16. * Проверяет имя пользователя
  17. *
  18. * @param Validator $v
  19. * @param null|string $username
  20. * @param string $attrs
  21. * @param mixed $originalUser
  22. *
  23. * @return null|string
  24. */
  25. public function username(Validator $v, $username, $attrs, $originalUser): ?string
  26. {
  27. if ($originalUser instanceof User) {
  28. $id = $originalUser->id;
  29. $old = $originalUser->username;
  30. } else {
  31. $id = null;
  32. $old = null;
  33. }
  34. if ($old !== $username) {
  35. $user = $this->c->users->create(['id' => $id, 'username' => $username]);
  36. // 2-25 символов, буквы, цифры, пробел, подчеркивание, точка и тире
  37. if (! \preg_match($this->c->USERNAME_PATTERN, $username)) {
  38. $v->addError('Login format');
  39. // идущие подряд пробелы
  40. } elseif (\preg_match('%\s{2,}%u', $username)) {
  41. $v->addError('Username contains consecutive spaces');
  42. // цензура
  43. } elseif ($this->c->censorship->censor($username) !== $username) {
  44. $v->addError('Username censor');
  45. // username забанен
  46. } elseif ($this->c->bans->banFromName($username) > 0) {
  47. $v->addError('Banned username');
  48. // есть пользователь с похожим именем
  49. } elseif (
  50. empty($v->getErrors())
  51. && ! $this->c->users->isUniqueName($user)
  52. ) {
  53. $v->addError('Username not unique');
  54. }
  55. }
  56. return $username;
  57. }
  58. }